【图像处理】基于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#数字图像处理(七)直方图匹配
直方图匹配,又称直方图规定化,即变换原图的直方图为规定的某种形式的直方图,从而使两幅图像具有类似的色调和反差.直方图匹配属于非线性点运算. 直方图规定化的原理:对两个直方图都做均衡化,变成相同的归一化 ...
随机推荐
- Linux学习6-套接字
套接字 1.什么是套接字? 套接字(socket)是一种通信机制,凭借这种机制,客户/服务器系统的开发工作既可以在本地单机上进行,也可以跨网络进行. 2.套接字应用程序是如何通过套接字来维持一个连接的 ...
- iOS常用小功能
CHENYILONG Blog 常用小功能 技术博客http://www.cnblogs.com/ChenYilong/ 新浪微博http://weibo.com/luohanchenyilong ...
- GORM 中文文档
由于篇幅问题,本文只是快速开始部分,下面是完整地址. 中文文档地址:http://gorm.book.jasperxu.com/ 中文文档项目地址:https://github.com/jasperx ...
- 图文详解 解决 MVC4 Code First 数据迁移
在使用Code first生成数据库后 当数据库发生更改时 运行程序就会出现数据已更改的问题 这时可以删除数据库重新生成解决 但是之前的数据就无法保留 为了保留之前的数据库数据 我们需要使用到C ...
- 操作系统环境变量LANG和NLS_LANG的关系
=Native Language Support本地语言支持 NLS ORACLE11g-ORA-12705: Cannot access NLS data files or invalid envi ...
- python3 web测试模块selenium
selenium是一个用于web应用程序测试工具,selenium测试直接运行在浏览器中,就像真正的用户在操作一样,支持的浏览器包括IE(7,8,9,10,11),mozilla firefox,sa ...
- MySQL V5.6.37升级到V5.6.38
简单!万事先备份 cp /usr/my.cnf /home/xx/ cp -r /var/lib/mysql/dbname /home/xx/ mysqldump -u root -ppasswd - ...
- 为何gpio_to_irq不能静态使用?【转】
之前在调试传感器模块的时候发现,在结构体声明的时候irq成员使用gpio_to_irq会报错,而动态使用的话就没有问题.就对gpio_to_irq为什么不能静态使用产生了疑问.恰巧最近又有朋友遇到了同 ...
- Project Euler Problem5
Smallest multiple Problem 5 2520 is the smallest number that can be divided by each of the numbers f ...
- apache本地配置多域名(wampserver本地配置多域名)
我们在本地开发时,一般是在浏览器输入 http://localhost/项目文件夹名来测试网页文件,你有没有想过在本地在浏览器输入你自己设定的一个域名进入项目文件夹中去,本地配置多域名可以测试二级域名 ...