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. IDEA中配置Jetty Server

    首先去 Eclipse官网下载Jetty jar包 鼠标移到Jetty上时 点击 Git it (得到它) 点击 .zip等待下载完成 然后 解压出来 接下就让我们 开始 使用IDEA了(创建一个We ...

  2. [转]vue-router各个属性的作用及用法

    转自以下网址,当备忘使用:https://www.cnblogs.com/goloving/p/9211358.html vue-router是vue单页面开发的路由,就是决定页面跳转的! <r ...

  3. learning armbian steps(7) ----- armbian 源码分析(二)

    从compile.sh开始入手: SRC="$(dirname "$(realpath "${BASH_SOURCE}")")" # fal ...

  4. windows下mysql 主库从库同步

    今天先讲讲数据库的主从同步,两个好处: 一是读写分离可以用上.比如 写操作就写到主数据库,读就再从库读取 二是纯粹给数据库备份,以防硬盘彻底崩了 主从数据库操作准备: 两台电脑,都安装好mysql 5 ...

  5. C# 父类代码动态转换子类

    百度上搜索C# 如何父类运行时转换成子类,没有得到相应答案,突然想起C# 有dynamic类型试试看结果成功了... 以后编写代码类似这样的代码 就可以删减掉了 if (en.type == EMap ...

  6. 利用pyltp进行实体识别

    一.实体识别作为信息抽取中基础的也是重要的一步,其技术可以分为三类,分别是其于规则的方法.其于统计模型的方法以及基于深度学习的方法. 基于规则的方法,主要依靠构建大量的实体抽取规则,一般由具有一定领域 ...

  7. HTTP缓存机制和原理

    前言 Http 缓存机制作为 web 性能优化的重要手段,对于从事 Web 开发的同学们来说,应该是知识体系库中的一个基础环节,同时对于有志成为前端架构师的同学来说是必备的知识技能.但是对于很多前端同 ...

  8. IO之复制文件的四种方式

    1. 使用FileStreams复制 这是最经典的方式将一个文件的内容复制到另一个文件中. 使用FileInputStream读取文件A的字节,使用FileOutputStream写入到文件B. 这是 ...

  9. Docker+Rancher构建部署流水线

    工作多年,在项目部署方面, 1:以前用ftp或者rz上传更新的,每次更新算上打包.目录切换.更新遗漏.备份.出错还原.启动等工作都得搞上一来小时甚至更长,要是多两台服务器那心都凉了: 2:后来有用sv ...

  10. OUC_Summer Training_ DIV2_#2之解题策略 715

    这是第一天的CF,是的,我拖到了现在.恩忽视掉这个细节,其实这一篇只有一道题,因为这次一共做了3道题,只对了一道就是这一道,还有一道理解了的就是第一篇博客丑数那道,还有一道因为英语实在太拙计理解错了题 ...