基于matlab的图像线性灰度变换

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('第二种切法');

运行结果:

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页