自己实现灰度图像增强(线性灰度增强)
线性灰度变换函数:
变换前图像f(x,y)的灰度范围为[a,b],变换后图像g(x,y)的灰度范围扩展或压缩至[c,d]。
1、代码:
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
void Tran_zeng(Mat &src,Mat &dst,uchar gMin,uchar gMax);
void Tran_zeng(Mat &src,Mat &dst,uchar gMin,uchar gMax)
{
dst=src.clone(); //得到原图像一份拷贝
uchar *p_data=dst.data;
int nWidth=src.cols; //得到图像宽度
int nHeigth=src.rows; //得到图像高度
int nLineByte=dst.cols; //一行字节数
int nPixel; //像素值
//逐个扫描图像中的像素点,进行灰度线性变换
for (int i=0;i<nHeigth;i++) //行
{
for (int j=0;j<nWidth;j++) //列
{
nPixel = p_data[nLineByte * i + j]; // 获取当前像素点的灰度值
//根据公式求出目标图像中与当前点对应的像素的灰度值
p_data[i * nLineByte + j] =(uchar)(((float)(gMax-gMin)/255)*nPixel+gMin);
}
}
}
int main()
{
Mat srcimg=imread("E:\\图库\\lena.bmp");
namedWindow("原图");
moveWindow("原图",20,20);
imshow("原图",srcimg);
if (srcimg.channels()==1)
{
cout<<"加载图像正确"<<endl;
}
else
{
cout<<"彩色转灰度"<<endl;
cvtColor(srcimg,srcimg,CV_BGR2GRAY);
}
namedWindow("灰度图");
moveWindow("灰度图",20,320);
imshow("灰度图",srcimg);
Mat dstimg;
Tran_zeng(srcimg,dstimg,0,255);
namedWindow("增强图像");
moveWindow("增强图像",20,620);
imshow("增强图像",dstimg);
waitKey(0);
return 0;
}
运行结果