OPENCV图像处理提高(一)图像增强
2016-07-23 21:56
225 查看
在图像处理学习中会涉及到直方图,直方图很好地表现了图像的灰度信息;同时我们注意到在暗图像中,直方图的分量集中在灰度级的低端;亮图像的灰度值集中在直方图灰度值的高端;低对比度的图像有较窄的直方图,并集中于直方图的中间部分;高对比度的图像中直方图的分量覆盖很宽的范围,而且像素的分布没有太不均匀,只能看到少量垂线比其他高许多。通过图像增强可以有效地减弱这些缺陷
如图1,细胞表面的一些地方较为模糊,图2,整体图片偏亮
来看先来看第一张图的直方分布图:
分量集中在灰度值较高地地方。
第二张图的直方分布图:
直方图
来看一下两张图片的直方分布图片:
下面两张是经图像增强处理图片:
可以明显看到图片比之前的要清晰;
再来看其直方分布图:
图 4
人脸的直方分布图:
首先,我们设连续的灰度r和z,同时令Pr(r)和Pz(z)表示其连续的概率密度函数。Pr(r)为原来图像的灰度概率函数,Pz(z)为经处理后的概率函数:
同时我们设一个随机变量s:
s=T(r)=(L−1)∫r0Pr(w)dw
其中w为积分变量;
接着定义随机变量z:
G(z)=(L−1)∫z0Pz(t)dt=s
其中t为积分变量;
由这两个公式可得G(z)=T(r)
z=G−1[T(r)]=G−1(s)
当输入函数Pr(r)时,变换函数T(r)可得到s;同时,Pz(z)可经过G(z)变换得到s,同时得到
z=G−1[T(r)]=G−1[(L−1)∫r0Pr(w)dw]
在实际中图像的直方图灰度分量是离散的,处理离散量时,只求得到一个近似的直方图:
sk=T(rk)=(L−1)∑kj=0Pr(rj)=L−1MN∑kj=0nj,k=0,1,2,3,⋅⋅⋅,L−1
其中MN是图像总的像素点,nj是具有灰度值rj的像素的个数,L是图像中可能的灰度级数;
接下来上代码:
这里 src,dir表示原来图像和目标图像,先遍历出各灰度值的像素个数,计算出概率prob,通过公式转化成目标图像的概率
fprintf将灰度值概率记下,方便用openGL或excel画出直方图进行比对
;
笔者能力有限,如有不足或错误欢迎指出
图 1
图 2
如图1,细胞表面的一些地方较为模糊,图2,整体图片偏亮
来看先来看第一张图的直方分布图:
分量集中在灰度值较高地地方。
第二张图的直方分布图:
直方图
来看一下两张图片的直方分布图片:
下面两张是经图像增强处理图片:
图 3
可以明显看到图片比之前的要清晰;
再来看其直方分布图:
图 4
人脸的直方分布图:
首先,我们设连续的灰度r和z,同时令Pr(r)和Pz(z)表示其连续的概率密度函数。Pr(r)为原来图像的灰度概率函数,Pz(z)为经处理后的概率函数:
同时我们设一个随机变量s:
s=T(r)=(L−1)∫r0Pr(w)dw
其中w为积分变量;
接着定义随机变量z:
G(z)=(L−1)∫z0Pz(t)dt=s
其中t为积分变量;
由这两个公式可得G(z)=T(r)
z=G−1[T(r)]=G−1(s)
当输入函数Pr(r)时,变换函数T(r)可得到s;同时,Pz(z)可经过G(z)变换得到s,同时得到
z=G−1[T(r)]=G−1[(L−1)∫r0Pr(w)dw]
在实际中图像的直方图灰度分量是离散的,处理离散量时,只求得到一个近似的直方图:
sk=T(rk)=(L−1)∑kj=0Pr(rj)=L−1MN∑kj=0nj,k=0,1,2,3,⋅⋅⋅,L−1
其中MN是图像总的像素点,nj是具有灰度值rj的像素的个数,L是图像中可能的灰度级数;
接下来上代码:
#include<opencv2\opencv.hpp> #include<opencv\cv.h> #include<opencv2\core\core.hpp> #include<stdlib.h> #include<math.h> using namespace cv; using namespace std; void enhance(Mat src, Mat dir) { FILE *fp; fp = fopen("src.txt", "w"); int srcpixel[256] = { 0 }; int dirpixel[256] = { 0 }; int p;//temp double srcprob[256]; double dirprob[256] = {0}; double zhong = src.rows*src.cols; for (int i = 0; i < src.rows; i++) { for (int j = 0; j < src.cols; j++) { p = src.at<uchar>(i, j); srcpixel[p]++; } } for (int i = 0; i < 255; i++) { srcprob[i] = srcpixel[i]/ zhong; fprintf(fp, "%lf ", srcprob[i]); printf("srcpixel[%d]=%f\n", i, srcprob[i]); } double o=0; dirprob[0] = srcprob[0]; for (int i = 1; i < 256; i++) { dirprob[i] = dirprob[i - 1] + srcprob[i]; } for (int i = 0; i < src.rows; i++) { for (int j = 0; j < src.cols; j++) { p = src.at<uchar>(i, j); dir.at<uchar>(i, j) = 255 * dirprob[p]; } } fclose(fp); // srcpixel[256] = { 0 }; fp = fopen("dir.txt", "w"); for (int i = 0; i < src.rows; i++) { for (int j = 0; j < src.cols; j++) { p = dir.at<uchar>(i, j); dirpixel[p]++; } } for (int i = 0; i < 255; i++) { srcprob[i] =dirpixel[i] / zhong; fprintf(fp, "%lf ", srcprob[i]); printf("srcpixel[%d]=%f\n", i, srcprob[i]); } fclose(fp); } int main(int argc,char *argv[]) { Mat src= imread("3.jpg",0); Mat dir(src.rows,src.cols,CV_8UC1); imshow("src", src); //cvtColor(pic, pic, CV_BGR2GRAY); //imshow("12", pic); enhance(src, dir); imshow("drt", dir); imwrite("22.jpg", dir); waitKey(); }
这里 src,dir表示原来图像和目标图像,先遍历出各灰度值的像素个数,计算出概率prob,通过公式转化成目标图像的概率
fprintf将灰度值概率记下,方便用openGL或excel画出直方图进行比对
;
笔者能力有限,如有不足或错误欢迎指出
相关文章推荐
- (linux)idr(integer ID management)机制
- Linux系统常用命令(咋个办呢 zgbn)
- 配置hadoop时,Linux主机名称不要带有下划线
- Linux man命令
- Unix/Linux 只有一个进程实例
- Understanding HDFS Recovery Processes (Part 1)
- 【Linux】进程的创建fork()和vfork()
- Java版抓取网站妹子图片
- 认识Linux基础之(一)
- linux基础——linux进程间通信(IPC)机制总结
- Linux --- 网卡配置问题
- Android开发常用开源框架(架构程序)及Volley不再升级了
- Openstack并行性能加速
- Linux 定时器alarm()
- centos 7 nginx+uwsgi+flask 环境搭建
- (linux)struct inode 和 struct file
- Linux系统用户与用户组管理
- linux 使用qq 这个qq2015更新的
- nginx 默认会把header里的参数去掉下划线
- Apache Flink Client生成StreamGraph