灰度图像的直方均衡、线性变换与线性拉伸
来源:互联网 发布:淘宝皮草品牌 编辑:程序博客网 时间:2024/04/30 05:06
前些天本来打算用VC6.0 + opencv1.0去学习图像处理,但后来发现还是VS + opencv2以上版本做比较顺手,所以装了vs2015,配置了环境什么的(VS2015配置opencv3.1.0)。在把环境配置好后,我就上网学习了别人写的代码,自己也开始写写简单的代码练手。因为作业的要求,所以写了实现了灰度图像的直方均衡、线性变换与线性拉伸的程序。如果对上述几个概念不是很清楚可以参考下这篇文章。
#include <opencv2/core/core.hpp>#include <opencv2/highgui/highgui.hpp>#include <iostream>using namespace std;using namespace cv;Mat XianChange(Mat &img, double alt, int base)//灰度线性变化、{CV_Assert(img.depth() != sizeof(uchar)); //声明只对深度8bit的图像操作 Mat temp = img.clone();int channels = img.channels(); //获取图像channel int nrows = img.rows; //矩阵的行数 int ncols = img.cols*channels; //矩阵的总列数=列数*channel分量数 if (img.isContinuous()) //判断矩阵是否连续,若连续,我们相当于只需要遍历一个一维数组 {ncols *= nrows;nrows = 1; //一维数组 }//遍历像素点灰度值 for (int i = 0; i<nrows; i++){uchar *p = temp.ptr<uchar>(i); //获取行地址 for (int j = 0; j<ncols; j++){p[j] = alt*p[j] + base;//修改灰度值 if (p[j] > 255)p[j] = 255;if (p[j] < 0)p[j] = 0;}}return temp;}Mat XianStretch(Mat &img, int a, int b, int c, int d)//线性灰度拉伸,将[a,b]拉伸到[c,d]{CV_Assert(img.depth() != sizeof(uchar)); //声明只对深度8bit的图像操作 Mat temp = img.clone();int channels = img.channels(); //获取图像channel int nrows = img.rows; //矩阵的行数 int ncols = img.cols*channels; //矩阵的总列数=列数*channel分量数 if (img.isContinuous()) //判断矩阵是否连续,若连续,我们相当于只需要遍历一个一维数组 {ncols *= nrows;nrows = 1; //一维数组 }//遍历像素点灰度值 for (int i = 0; i<nrows; i++){uchar *p = temp.ptr<uchar>(i); //获取行地址 for (int j = 0; j<ncols; j++){if (p[j] < a)p[j] = c / b * p[j];else if (p[j] > a && p[j] < b)p[j] = (d - c) / (b - a) * (p[j] - a) + c;elsep[j] = (255 - d) / (255 - b) *(p[j] - b) + d;}}return temp;}Mat HistogramEqu(Mat &img) //直方均衡{CV_Assert(img.depth() != sizeof(uchar)); //声明只对深度8bit的图像操作 Mat temp = img.clone();int grayNum[260] = { 0 };int grayMap[260] = { 0 };int channels = img.channels(); //获取图像channel int nrows = img.rows; //矩阵的行数 int ncols = img.cols*channels; //矩阵的总列数=列数*channel分量数 int allPixel = nrows*ncols; //图像的像素总数int c; //用于计算累积分布概率if (img.isContinuous()) //判断矩阵是否连续,若连续,我们相当于只需要遍历一个一维数组 {ncols *= nrows;nrows = 1; //一维数组 }//遍历像素点灰度值 for (int i = 0; i<nrows; i++){uchar *p = temp.ptr<uchar>(i); //获取行地址 for (int j = 0; j<ncols; j++){grayNum[p[j]]++; //原图像的直方图}}for (int i = 0; i < 256; i++) //重新定义新的直方图{c = 0;for (int j = 0; j<=i; j++){c += grayNum[j];grayMap[i] = int (255 * c / allPixel);}//printf("%d %d\n", i, grayMap[i]);}for (int i = 0; i < nrows; i++) //重新定义新的直方图{uchar *p = temp.ptr<uchar>(i); //获取行地址 for (int j = 0; j < ncols; j++){p[j] = grayMap[p[j]];}}return temp;}int main(){string picName = "lena256.jpg";Mat A = imread(picName, CV_LOAD_IMAGE_GRAYSCALE); //读入灰度图像 imshow("变换前", A);Mat B = XianChange(A, 1, 20);//根据需要设置不同的参数imshow("线性变换后", B);Mat C = XianStretch(A, 10, 100, 20, 50);//根据需要设置不同的参数imshow("线性拉伸后", C);Mat D = HistogramEqu(A);imshow("直方均衡后", D);waitKey();return 0;}
程序运行完后的效果图:
使用的原图:
0 0
- 灰度图像的直方均衡、线性变换与线性拉伸
- 图像灰度化 直方均衡
- java实现图像的直方图均衡以及灰度线性变化,灰度拉伸
- 图像处理 灰度的线性变换
- [mtalab图像处理] 灰度的线性变换
- 实验二 灰度图像的线性变换
- 图像处理与模式识别作业一:直方图均衡与灰度拉伸
- OpenCV 图像增强—直方图均衡化和灰度拉伸
- 灰度的线性变换
- 灰度图像直方图的创建与灰度图像直方图的均衡化[代码与运行结果]
- 数字图像处理MFC程序设计之灰度图像的线性变换
- OpenCV灰度值线性变换与分段线性变换
- 图像灰度拉伸
- 灰度图像拉伸方法
- 灰度图像直方图的均衡化与规定化
- 选用灰度线性拉伸进行图像增强,应用八方向的sobel算子得到边缘检测图像。
- 【线性空间】与【线性变换】
- 图像处理(4)_灰度线性变换
- 无线电频谱和波段划分
- vim E303
- UPDATE & DELETE (For MySQL)
- sql中的dbl的含义
- bzoj 2824: [AHOI2012]铁盘整理
- 灰度图像的直方均衡、线性变换与线性拉伸
- 使用线程接收串口接收数据,DLT645 2007 智能电表抄表代码
- CCF201612-1-中间数
- centos7下的NFS 服务器端的搭建
- Python
- 微信JSAPI模式与浏览器类型安全访问
- windows下启动openoffice服务
- Floyed那些事~~~~~
- 【Computer Vision】计算机视觉相关课程和书籍