unmix

该程序用来消除“像素混叠”。所谓像素混叠,是值在自然场景的图像中,边缘线成像到cmos的像素上时,某些像素会刚好跨在该边缘线上。

这样的像素特点就是,其R、G、B三色像素梯度值不一致。比如说cmos上,每个彩色像素有R、G、B三色传感器组成,其排列方式是依次从左向右排序。

那么,如果刚好有一条倾斜的边缘线该像素的G位置,且该边缘线上部为背景、下部为物体,那么其三色梯度值不同,且dR>dB,反之则dB>dR.。类似于这样

的像素,我们可以通过unmix的方法将其消除。方法很简单,就是将该像素邻域内梯度相同或相近的像素替换该像素。下面是程序代码:

Mat unmix(const Mat&img,int neibourSize)
{
Mat imgCopy=img.clone();
int nr=neibourSize/2;
int cols=img.cols,rows=img.rows;
Mat kernel_x=(Mat_<int>(1,2)<<-1,1);
Mat kernel_y=(Mat_<int>(2,1)<<-1,1);
Mat img_dx,img_dy;//预声明X、Y方向的梯度矩阵
filter2D(img,img_dx,CV_32F,kernel_x);
filter2D(img,img_dy,CV_32F,kernel_y); Mat Gradient=abs(img_dx)+abs(img_dy); Mat theta=getGradientDirect(img_dy,img_dx);//该函数参见:https://www.cnblogs.com/phoenixdsg/p/11352623.html Mat thetaGray;
cvtColor(theta,thetaGray,COLOR_RGB2GRAY);//转成灰度图像便于处理 ///unmix()函数
for(int i=nr;i<rows-nr;i++)
{
for(int j=nr;j<cols-nr;j++)
{
float* pG=CV_MAT_ELEM2(Gradient,float,i,j);
float R=pG[2],G=pG[1],B=pG[2];
if(R!=B||R!=G||B!=G)
{
Mat tmp=thetaGray(Rect(j-nr,i-nr,neibourSize,neibourSize));
Mat tmpr=tmp.clone();//截取邻域像素
float Pij=*(CV_MAT_ELEM2(thetaGray,float,i,j));//获取当前像素值
tmpr =abs(tmpr-Pij);
tmpr.at<float>(nr,nr)=7; double minv;
Point minLoc;
minMaxLoc(tmpr,&minv,0,&minLoc);
minLoc=Point(nr,nr)-minLoc;
// cout<<"minv="<<minv<<" ; "
// <<"minLoc="<<minLoc<< endl;
int ii=minLoc.y+i,jj=minLoc.x+j;
for(int k=0;k<3;k++)
{
imgCopy.ptr<Vec3b>(i)[j][k]=
img.ptr<Vec3b>(ii)[jj][k];
}
}
}
}
return imgCopy;
}

  该函数有两个参数,第一个是待处理的图像,第二个参数是邻域尺寸,尺寸必须是3、5、7等奇数。函数返回值,即是unmix的结果。

conditional average

设当前像素为N0,其邻域像素集合为S,从S中挑选有效像素{Ni}。求取有效像素均值N0',并替代N0

其中S={Ni: |Ni=N0|<T}。其中n是有效像素个数。注意S中始终包含N0。该程序会产生下面的效果:

1)在一个同质区域中,平滑掉小量噪声,噪声的相对值小于T;

2)在区域边界附近,对比度要大于T,刚好跨在边界上的像素不作均值处理。这样在平滑图像时,只对边界两边的像素作均值处理。

这与普通的均值模糊不同,普通的均值模糊连边界也被模糊了;

3)该程序只平滑一定梯度范围内的噪声,但不会将梯度平滑掉;

4)在纹理区域,如果纹理像素之间会有小量的差异(小于T),那么这些像素将被平滑为通知区域,也就是消除纹理。

如果纹理像素之间差值大于T,那么将不做平滑处理。

程序代码如下:

void conditionalAerage(Mat&img,int T)
{
int rows=img.rows,cols=img.cols;
int neighborSize=3;
int nr=neighborSize/2;
for(int i=nr;i<rows-nr;i++)
{
for(int j=nr;j<cols-nr;j++)
{
int ctn=0;
vector<Vec3b> nv;
Vec3b P0=img.at<Vec3b>(i,j);
float P0m=float(P0[0]+P0[1]+P0[1])/3.;
for(int in=i-nr;in<neighborSize;in++)
{
for(int jn=i-nr;jn<neighborSize;jn++)
{
Vec3b Pn=img.at<Vec3b>(in,jn);
float Pnm=float(Pn[0]+Pn[1]+Pn[1])/3.;
if(abs(Pnm-P0m)<T)
{
nv.push_back(Pn);
}
}
Vec3b sum(0,0,0);
ctn=nv.size();
for(int v=0;v<ctn;v++)
{
sum +=nv[v];
}
Vec3b aver=sum/ctn;
for(int k=0;k<img.channels();k++)
img.at<Vec3b>(i,j)[k]=aver[k];
} }
}
}

  

unmix和conditional average:消混叠和条件均值的更多相关文章

  1. 学习笔记:The Best of MySQL Forum

    http://mysql.rjweb.org/bestof.html I have tagged many of the better forum threads. 'Better' is based ...

  2. Paper慢慢读 - AB实验人群定向 Recursive Partitioning for Heterogeneous Casual Effects

    这篇是treatment effect估计相关的论文系列第一篇所以会啰嗦一点多给出点背景. 论文 Athey, S., and Imbens, G. 2016. Recursive partition ...

  3. 因果推理综述——《A Survey on Causal Inference》一文的总结和梳理

    因果推理 本文档是对<A Survey on Causal Inference>一文的总结和梳理. 论文地址 简介 关联与因果 先有的鸡,还是先有的蛋?这里研究的是因果关系,因果关系与普通 ...

  4. training 2

    Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.136 Average Precision (AP) @[ IoU ...

  5. Learning Bayesian Network Classifiers by Maximizing Conditional Likelihood

    Abstract Bayesian networks are a powerful probabilistic representation, and their use for classifica ...

  6. (转)Image Segmentation with Tensorflow using CNNs and Conditional Random Fields

    Daniil's blog Machine Learning and Computer Vision artisan. About/ Blog/ Image Segmentation with Ten ...

  7. linux下c++實現簡單的生產者消費者隊列模式

    引言 生產者消費者是一個經典的模式 利用生產者,消費者和緩衝區降低了生產者和消費者之間的的耦合度 便於對生產者和消費者的修改 下面記錄的是一個經典的單一生產者多消費者的模式 設計思路 以隊列做為緩衝區 ...

  8. Theano3.6-练习之消噪自动编码器

    来自:http://deeplearning.net/tutorial/dA.html#daa Denoising Autoencoders (dA) note:该部分假设读者已经看过(Theano3 ...

  9. uva 10828 高斯消元求数学期望

    Back to Kernighan-RitchieInput: Standard Input Output: Standard Output You must have heard the name ...

随机推荐

  1. Git 分支开发规范

    您必须知道的 Git 分支开发规范 Git 是目前最流行的源代码管理工具. 为规范开发,保持代码提交记录以及 git 分支结构清晰,方便后续维护,现规范 git 的相关操作. 分支管理 分支命名 ma ...

  2. Linux命令之nano(简单文本编辑器)

    nano 字符终端文本编辑器 补充说明 nano 是一个字符终端的文本编辑器,有点像DOS下的editor程序.它比vi/vim要简单得多,比较适合Linux初学者使用.某些Linux发行版的默认编辑 ...

  3. modbus_百度经验

    转自:https://jingyan.baidu.com/article/2c8c281dbdfa9f0009252a74.html 图片都没了,百度真差劲---还是博客园好!!! ModBus通讯规 ...

  4. 使用Future、asyncio处理并发

    并发的意义 为了高效处理网络I/O,需要使用并发,因为网络有很高的延迟,所以为了不浪费CPU周期去等待,最好在收到网络响应之前做些其他的事. 在I/O密集型应用中,如果代码写得正确,那么不管是用哪种并 ...

  5. LA 7263 Today Is a Rainy Day bfs+暴力 银牌题

    7263 Today Is a Rainy Day Today is a rainy day. The temperature is apparently lower than yesterday. ...

  6. word标题前出现黑块解决方案

    1,将光标定位到出现问题的标题前面 2,点击最上方的标题,然后点击修改-->格式-->编号-->无-->确定. 3,重新设置标题即可.

  7. 利用Python+Redis实现分布式锁

    class MyDLock(object): def __init__(self, lockID,timeout): self.connection = redis.Redis(host=cfg.RE ...

  8. POJ 1741 Tree ——(树分治)

    思路参考于:http://blog.csdn.net/yang_7_46/article/details/9966455,不再赘述. 复杂度:找树的重心然后分治复杂度为logn,每次对距离数组dep排 ...

  9. Linux系统下关闭与启动Oracle11g的顺序与命令

    关闭: 1.关EM:[oracle@localhost ~] emctl stop dbconsole 2.关监听:[oracle@localhost ~] lsnrctl stop 3.关数据库:S ...

  10. 【Webscraper】不懂编程也能爬虫

    一.配置环境 在浏览器中安装web scraper插件. 所有安装包下载链接: https://pan.baidu.com/s/1CfAWf0wMO6WqicoUgdYgkg 提取码: nn2e 安装 ...