1.基本线性灰度变换
只需要记住一个公式:g(x, y) = f(x, y) * tan a
当 tan a >1时,会使得图像变亮
当tan a =1时,前后图像不发生变化
当tan a<1时,图像变暗
Image =im2double(rgb2gray(imread('hehua.bmp')));
[h, w] = size(Image);
Image1 = zeros(h,w);
Image2 = zeros(h,w);
Image3 = zeros(h,w);
for i = 1:h
for j = 1:w
Image1(i,j)= Image(i, j)* tan(0.1 * pi);
Image2(i,j)= Image(i, j)* tan(0.25 * pi);
Image3(i,j)= Image(i, j)* tan(0.4 * pi);
end
end
subplot(221),imshow(Image),title('原图');
subplot(222),imshow(Image1),title('变暗');
subplot(223),imshow(Image2),title('不变');
subplot(224),imshow(Image3),title('变亮');
运行后的结果为:
2.分段线性灰度变换
分段线性灰度变换的原理很简单,例如将[0,a]范围内的灰度值转换好[0,c]内,实际就是求O A直线方程,然后一个横坐标对应一个纵坐标,图中OA反应了[0,a]被压缩到了[0,c] ,同理[a,b]被扩展到了[c,d]。
Image = imread('hehua.bmp');
Image = im2double(rgb2gray(Image));
[h, w] =size(Image);
% 分段线性灰度变换
Image1 = zeros(h, w); %(行,列)
a = 30/256;
b = 100/256;
c = 75/256;
d = 200/256;
for i=1:h
for j= 1:w
if Image(i,j)<=a
Image1(i,j) = c/a * Image(i, j);
elseif Image(i,j)<b
Image1(i,j) = (d-c)/(b-a)*(Image(i,j) - a) + c;
else
Image1(i,j) = (1-d)/(1-b)*(Image(i,j) - b) +d;
end
end
end
% 高低端灰度不变
Image2 = Image;
for x =1:h
for y=1:w
if a<Image(x, y)<b
Image2(x,y) = (d-c)/(b-a)*(Image(x,y) - a) + c;
end
end
end
% 截取式灰度变换
Image3 = imadjust(Image, [a;b], [c;d]);
%[a;b]为要变换的灰度空间 [c,d]为要变换到的灰度空间
%小于a的被直接赋值为c 大于b的被直接赋值为b
subplot(141),imshow(Image),title('原图');
subplot(142),imshow(Image1),title('分段灰度变换');
subplot(143),imshow(Image2),title('高低端灰度不变');
subplot(144),imshow(Image3),title('截取式灰度变换');
结果为:
另外,分段线性灰度变换还有一种叫做切片的操作直接码
Image = im2double(rgb2gray(imread('X.jpg')));
[h, w] = size(Image);
a= 170/256 ; b = 200/256; c= 35/256; d =250/256;
Image1 = zeros(h,w);
Image2 = Image;
for i=1:h
for j=1:w
if Image(i,j)<c
Image1(i,j)=c;
else
Image1(i,j)=d;
end
end
end
for x=1:h
for y=1:w
if c<Image(x,y)<b
Image2(x,y)=0;
end
end
end
subplot(131),imshow(Image),title('原图');
subplot(132),imshow(Image1),title('第一种切法');
subplot(133),imshow(Image2),title('第二种切法');
运行结果: