标签:
一张图像来说,会有不同的亮暗程度,很多时候都要增强一下,增强的方法有很多,从大量可以说是线性变换和非线性变换,当然这是说空间域的,频率域的暂时不考虑。
线性变换增强,也是对点的操作,如下图
一、点操作,线性增强
两种常用的点过程(即点算子),是用常数对点进行 乘法 和 加法 运算:
两个参数 和 一般称作 增益 和 偏置 参数。我们往往用这两个参数来分别控制 对比度 和 亮度 。
你可以把 看成源图像像素,把 看成输出图像像素。这样一来,上面的式子就能写得更清楚些:
其中, 和 表示像素位于 第i行 和 第j列
<span style="font-size:18px;">#include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <iostream> using namespace std; using namespace cv; double alpha; /**< 控制对比度 */ int beta; /**< 控制亮度 */ int main( int argc, char** argv ) { /// 读入用户提供的图像 Mat image = imread("lena.jpg" ); Mat new_image = Mat::zeros( image.size(), image.type() ); /// 初始化 //cout << " Basic Linear Transforms " << endl; //cout << "-------------------------" << endl; //cout << "* Enter the alpha value [1.0-3.0]: "; //cin >> alpha; //cout << "* Enter the beta value [0-100]: "; //cin >> beta; int alpha=2; int beta=20; /// for循环执行运算 new_image(i,j) = alpha*image(i,j) + beta for( int y = 0; y < image.rows; y++ ) { for( int x = 0; x < image.cols; x++ ) { for( int c = 0; c < 3; c++ ) { new_image.at<Vec3b>(y,x)[c] = saturate_cast<uchar>( alpha*( image.at<Vec3b>(y,x)[c] ) + beta ); } } } /// 创建窗口 namedWindow("Original Image", 1); namedWindow("New Image", 1); /// 显示图像 imshow("Original Image", image); imshow("New Image", new_image); /// 等待用户按键 waitKey(); return 0; }</span>
二、带滑动条的图像对比度增强
<span style="font-size:18px;">C++: int createTrackbar(conststring& trackbarname, conststring& winname, int* value, int count, TrackbarCallback onChange=0,void* userdata=0); </span>
<span style="font-size:18px;"> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include "opencv2/imgproc/imgproc.hpp" #include <iostream> using namespace std; using namespace cv; static void ContrastAndBright(int, void *); int g_nContrastValue; //对比度值 int g_nBrightValue; //亮度值 Mat g_srcImage,g_dstImage; int main( ) { g_srcImage = imread( "lena.jpg"); g_dstImage = Mat::zeros( g_srcImage.size(), g_srcImage.type() ); g_nContrastValue=80; g_nBrightValue=80; namedWindow("【效果图窗口】", 1); //创建轨迹条 createTrackbar("对比度:", "【效果图窗口】",&g_nContrastValue, 300,ContrastAndBright ); createTrackbar("亮 度:", "【效果图窗口】",&g_nBrightValue, 200,ContrastAndBright ); //调用回调函数 ContrastAndBright(g_nContrastValue,0); ContrastAndBright(g_nBrightValue,0); //输出一些帮助信息 cout<<endl<<"\t运行成功,请调整滚动条观察图像效果\n\n" <<"\t按下“q”键时,程序退出\n"; //按下“q”键时,程序退出 while(char(waitKey(1)) != 'q') {} return 0; } static void ContrastAndBright(int, void *) { namedWindow("【原始图窗口】", 1); // 三个for循环,执行运算 g_dstImage(i,j) = a*g_srcImage(i,j) + b for( int y = 0; y < g_srcImage.rows; y++ ) { for( int x = 0; x < g_srcImage.cols; x++ ) { for( int c = 0; c < 3; c++ ) { g_dstImage.at<Vec3b>(y,x)[c] = saturate_cast<uchar>( (g_nContrastValue*0.01)*( g_srcImage.at<Vec3b>(y,x)[c] ) + g_nBrightValue ); } } } // 显示图像 imshow("【原始图窗口】", g_srcImage); imshow("【效果图窗口】", g_dstImage); } </span>
三、Matlab辅助
maltab中主要用的函数是imadjust()
<span style="font-size:18px;">J = imadjust(I,[low_in high_in],[low_out high_out])</span>
clear all; I = imread('pout.tif'); J = imadjust(I); subplot(1,4,1);imshow(I), xlabel('(a)原始图像') subplot(1,4,2), imshow(J) xlabel('(b)增强对比度所得图像') K=imadjust(I,[0.4,0.8],[]); %对指定的灰度范围进行图像增强处理 subplot(1,4,3), imshow(K) xlabel('(c)指定对比度范围增强图像') K1=imadjust(I,[],[0.4 0.6]); %对指定的灰度范围进行图像增强处理 subplot(1,4,4), imshow(K1) xlabel('(d)指定对比度范围增强图像') K2=imadjust(I,[0.5 0.8],[],0.5); %对指定的灰度范围进行图像增强处理 figure imshow(K2)
标签:
原文地址:http://blog.csdn.net/qq_20823641/article/details/51939827