反转灰度范围[0,L-1]的图像需要使用L-1减去图像灰度值,公式:
s = L-1-r
matlab代码
>> gyy = imread('gyy.jpg');
>> L = uint8(255*ones(size(gyy)));
>> imshow(gyy);
>> figure,imshow(L-gyy)
对数变换使灰度较低的区域对比度得到增强,或使灰度较高区域对比度增强(反对数变换),其公式与曲线:
s=c*log(1+r)
matlab代码:
f = rgb2gray(imread('DFT.png'));
fd = double(f);
c = 1;
s_1 = uint8(c*log2(1+fd));
c = 10;
s_2 = uint8(c*log2(1+fd));
c = 20;
s_3 = uint8(c*log2(1+fd));
figure(),imshow(f);
figure(),imshow(s_1);
figure(),imshow(s_2);
figure(),imshow(s_3);
结果:
从左到右依次是原图,c = 1,10,20的结果(灰度低的区域对比度增强)
注:《数字图像处理》书上的结果在c = 1时对比度高一些,可能因为印刷时经过提高对比度处理。
幂律(伽马)变换多用于伽马校正和对比度增强。
伽马校正:处理太亮或者太暗的图像,多用于屏幕上的精确校正。
伽马校正例子:
gm = rgb2gray(imread('gm.png'));
gmd = double(gm);
c = 3;
r = 0.7;
s_1 = c*gmd.^(r);
>> imshow(gm);title('原图');
>> figure();imshow(uint8(s_1));title('c = 3, γ = 0.7')
对比度增强的例子:
gyy = imread('gyy.jpg');
gyyd = double(gyy);
c = 0.8;
r = 1.2;
>> s = c*gyyd.^(r);
>> imshow(gyy);title('原图');
>> figure();imshow(uint8(s));title('c=0.8,γ=1.2')
#include "opCVHead.h"
#include
namespace contrastStretch{
std::function<uchar(uchar)> getFunc(uchar point1_x,uchar point1_y,uchar point2_x,uchar point2_y);
int contrastStretch(){
auto im = imread("/Users/qixiangzhang/Desktop/dbdls.jpg");
if(!im.data) return 0;
imshow("Original", im);
int nl = im.rows;
int nc = im.cols*im.channels();
auto func = getFunc(100, 20, 160, 230);
uchar* data;
for(int j = 0; juchar>(j);
for(int i = 0; i"process",im);
return 1;
}
std::function<uchar(uchar)> getFunc(uchar point1_x,uchar point1_y,uchar point2_x,uchar point2_y){
if(point1_x > point2_x || point1_y > point2_y) return NULL;
double k_1 = point1_y / point1_x;
double k_2 = (point2_y - point1_y) / (point2_x - point1_x);
double k_3 = (255 - point2_y)/(255 - point2_x);
double b_2 = point1_y - k_2 * point1_x;
double b_3 = point2_y - k_3 * point2_x;
auto func = [=](uchar x) ->uchar{
if (x < point1_x) return k_1*x;
if (x > point2_x)return k_3*x + b_3;
return k_2*x + b_2;
};
return func;
}
};
灰度级分层
突出某特定灰度区域。
理解较简单,代码难度小,不上代码了。
比特平面
比特平面是指将固定区间的灰度值分离出来。
理解较简单,代码难度小,不上代码了。