【图像处理】基于OpenCV底层实现的直方图匹配
image processing 系列:
直方图匹配算法。又称直方图规定化。简单说。就是依据某函数、或者另外一张图片的引导,使得原图改变。
感觉解释的最好的是:http://www.360doc.com/content/13/1106/16/10724725_327179043.shtml
完整代码:github (里面同一时候包括OSTU / 大津算法、直方图均衡化等算法,还包括两种測试图片)。
由于我个人兴趣爱好(放P就是老师逼的。
。。)。不同意使用 OpenCV 封装好的直方图函数。
依据实例解说,了解了直方图匹配算法底层的操作(多说一句,这个样例能够是我见过最好的直方图匹配算法解说,也是非常难见的此算法的样例,必读)。
注:实例解说中 0->3 的意义是,原图中灰度级为 0 的像素点所有转化为原图中的 3 灰度级。
上代码(当中,srcImg 是原图。dstImg 是须要匹配的图,flag 标记两者是 RGB 图还是灰度图):
cv::Mat ycMatchHist(cv::Mat srcImg, cv::Mat dstImg, int flag)
{
// ****** 假设是 RGB 图片则转为灰度图片操作 ******
Mat out(srcImg);
if (flag == YC_RGB)
{
cvtColor(srcImg, out, CV_BGR2GRAY);
}
else if (flag == YC_GRAY)
{
}
int grayLevel[colvl];
for(int i=0; i<colvl; i++) grayLevel[i] = i; int grayArr[colvl];
int srcRow = srcImg.rows;
int srcCol = srcImg.cols;
int dstRow = dstImg.rows;
int dstCol = dstImg.cols;
float srcCdfArr[colvl] = {0.f};
float dstCdfArr[colvl] = {0.f};
float tmp; // *** 求解源图片的累积直方图(概率)分布 ***
memset(grayArr, 0, sizeof(grayArr));
for(size_t nrow = 0; nrow < srcRow; nrow++)
for(size_t ncol = 0; ncol < srcCol; ncol++)
{
int tag = srcImg.at<uchar>(nrow, ncol);
grayArr[tag]++;
} tmp = 0;
for(int i=0; i<colvl; i++)
{
tmp += grayArr[i];
srcCdfArr[i] = tmp / (srcRow * srcCol);
// std::cout<<srcCdfArr[i]<<std::endl;
} // *** 求解目标图片的累积直方图(概率)分布 ***
memset(grayArr, 0, sizeof(grayArr));
for(size_t nrow = 0; nrow < dstRow; nrow++)
for(size_t ncol = 0; ncol < dstCol; ncol++)
{
int tag = dstImg.at<uchar>(nrow, ncol);
grayArr[tag]++;
} tmp = 0;
for(int i=0; i<colvl; i++)
{
tmp += grayArr[i];
dstCdfArr[i] = tmp / (dstRow * dstCol);
} // *** 直方图匹配算法 ***
int histMap[colvl];
int minTag;
for(int i=0; i<colvl; i++)
{
float minMap = 10.f;
for(int j=0; j<colvl; j++)
{
if (minMap > abs(srcCdfArr[i] - dstCdfArr[j]))
{
minMap = abs(srcCdfArr[i] - dstCdfArr[j]);
minTag = j;
}
}
histMap[i] = minTag;
} for(size_t nrow = 0; nrow < out.rows; nrow++)
for(size_t ncol = 0; ncol < out.cols; ncol++)
{
int tag = out.at<uchar>(nrow, ncol);
out.at<uchar>(nrow, ncol) = histMap[tag];
} return out;
}
实验结果例如以下:
原图为;
须要匹配的图是
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaXJvbnlvdW5n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">。
终于输出的是图
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaXJvbnlvdW5n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">。
匹配图片的灰度累积直方图为:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaXJvbnlvdW5n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">;
终于输出的灰度累积直方图为:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaXJvbnlvdW5n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
两者非常接近了,证明匹配算法是可行的(当然假设我说错了,欢迎打脸。共同进步哈哈~)
【图像处理】基于OpenCV底层实现的直方图匹配的更多相关文章
- 【图像处理】基于OpenCV底层实现的图片旋转
image processing 系列 [图像处理]直方图匹配 [图像处理]高斯滤波.中值滤波.均值滤波 图片旋转,本质上是对旋转后的图片中每一个像素点计算在原图的位置.然后照搬过来就好. (多说一句 ...
- 【图像处理】基于OpenCV实现图像直方图的原理
背景 图像的直方图是衡量图像像素分布的一种方式,可以通过分析像素分布,使用直方图均衡化对图像进行优化,让图像变的清晰. opencv官方对图像直方图的定义如下: 直方图是图像中像素强度分布的图形表达方 ...
- 基于Opencv和Mfc的图像处理增强库GOCVHelper(索引)
GOCVHelper(GreenOpen Computer Version Helper )是我在这几年编写图像处理程序的过程中积累下来的函数库.主要是对Opencv的适当扩展和在实现Mfc程序时候的 ...
- OpenCV直方图(直方图、直方图均衡,直方图匹配,原理、实现)
1 直方图 灰度级范围为 \([0,L-1]\) 的数字图像的直方图是离散函数 \(h(r_k) = n_k\) , 其中 \(r_k\) 是第\(k\)级灰度值,\(n_k\) 是图像中灰度为 \( ...
- 基于OpenCV的双目视觉匹配测距系统
刚读研究生的时候,自己导师研究的方向是双目视觉,于是让自己研究OpenCV,折腾了几个月,算法上没啥突破,不过工程上还是折腾出了一个能用的小玩意,基于OpenCV实现了相机的标定.双目视觉图片的矫正. ...
- 基于 opencv 的图像处理入门教程
前言 虽然计算机视觉领域目前基本是以深度学习算法为主,但实际上很多时候对图片的很多处理方法,并不需要采用深度学习的网络模型,采用目前成熟的图像处理库即可实现,比如 OpenCV 和 PIL ,对图片进 ...
- Python图像处理丨基于OpenCV和像素处理的图像灰度化处理
摘要:本篇文章讲解图像灰度化处理的知识,结合OpenCV调用cv2.cvtColor()函数实现图像灰度操作,使用像素处理方法对图像进行灰度化处理. 本文分享自华为云社区<[Python图像处理 ...
- 图像处理基础(2):自适应中值滤波器(基于OpenCV实现)
本文主要介绍了自适应的中值滤波器,并基于OpenCV实现了该滤波器,并且将自适应的中值滤波器和常规的中值滤波器对不同概率的椒盐噪声的过滤效果进行了对比.最后,对中值滤波器的优缺点了进行了总结. 空间滤 ...
- c#数字图像处理(七)直方图匹配
直方图匹配,又称直方图规定化,即变换原图的直方图为规定的某种形式的直方图,从而使两幅图像具有类似的色调和反差.直方图匹配属于非线性点运算. 直方图规定化的原理:对两个直方图都做均衡化,变成相同的归一化 ...
随机推荐
- 关于cookie和session
在设置cookie的时候,它会保留在本地,无论你有没有退出浏览器都是.但是session只能在登录状态有效.退出浏览器过后就会消除掉.同时设置也是有问题的. @app.route('/login',m ...
- python垃圾回收之分代回收
可参考vamei的博客和https://www.jianshu.com/p/1e375fb40506
- python 入门基础23 选课系统 项目
选课系统 代码地址:github_code # 选课系统 # 角色:学校.学员.课程.讲师 # 要求: # 1. 创建北京.上海 2 所学校 # 2. 创建linux , python , go 3个 ...
- 【C++】cmdline——轻量级的C++命令行解析库
1.说明 cmdline是一个轻量级的c++命令行参数解析工具,全部源码只有一个cmdline.h头文件. 2.代码 20171210_命令行进行解析.cpp // 20171210_命令行进行解析. ...
- python3之模板pycurl探测web服务质量
1.pycurl简介 pycURL是libcurl多协议文件传输库的python接口,与urllib模块类似,PycURL可用于从python程序中获取由URL标识的对象,功能很强大,libcurl速 ...
- 让linux中 history显示每条命令的操作时间及操作用户【转】
一.history 中显示日期时间用户名的办法 history 命令,用来显示命令行上的操作记录 不过默认是仅显示操作命令行本身,而没有记录操作时间等细节 例如 这样,我们查找记录时很麻烦,想回顾下某 ...
- elasticsearch安装ik分词器(非极速版)
1.下载下载地址为: https://github.com/medcl/elasticsearch-analysis-ik 2.解压把下载的 elasticsearch-analysis-ik.zip ...
- 乐视max2 在开发中无法打印某些logcat 解决方案
乐视屏蔽了打印log.d等类型logcat.解决方案:拨号键盘 *#*#76937#*#* 出现页面后选最下面那个选项就有了.
- Java8系列之重新认识HashMap
转自: http://www.importnew.com/20386.html 简介 Java为数据结构中的映射定义了一个接口java.util.Map,此接口主要有四个常用的实现类,分别是Ha ...
- Android 6.0 API
Android 6.0 (M) 为用户和应用开发者提供了新功能.本文旨在介绍其中最值得关注的 API. 着手开发 要着手开发 Android 6.0 应用,您必须先获得 Android SDK,然后使 ...