0
点赞
收藏
分享

微信扫一扫

Matlab底层算法实现图像分段线性变换

花明 2022-03-22 阅读 92

公式

函数表达式如下:
                                                      f ( x ) = { y 1 x / x 1 , x < x 1 ( y 2 − y 1 ) ( x − x 1 ) / ( x 2 − x 1 ) + y 1 , x 1 ⩽ x ⩽ x 2 ( 255 − y 2 ) ( x − x 2 ) / ( 255 − x 2 ) + y 2 , x > x 2 f(x)=\left\{\begin{matrix} y_{1}x/x_{1} ,& x<x_{1}\\ (y_{2}-y_{1})(x-x_{1})/(x_{2}-x_{1})+y_{1}, & x_{1}\leqslant x\leqslant x_{2}\\ (255-y_{2})(x-x_{2})/(255-x_{2})+y_{2}, & x>x_{2} \end{matrix}\right. f(x)=y1x/x1,(y2y1)(xx1)/(x2x1)+y1,(255y2)(xx2)/(255x2)+y2,x<x1x1xx2x>x2
( x 1 , y 1 ) (x1,y1) (x1,y1) ( x 2 , y 2 ) (x2,y2) x2,y2是图中两个转折点坐标。

源代码

clc
image = imread('D:\2.png');
image_matrix=image(:,:,1);
image_matrix=double(image_matrix);
[height,width,channels]=size(image);
G=zeros(height,width);

%设定的坐标点
x1=130;
x2=150;
y1=50;
y2=200;

%灰度映射表,灰度在0255之间
gray_map = zeros(1,256);

%计算灰度映射表
for i=1:x1   %先判断0到x1区间内的
  if(x1>0)
     gray_map(i)=y1*i/x1;
  else
     gray_map(i)=0;
  end
end

for i=x1+1:x2  %判断x1到x2区间内的
  if(x2~=x1)
     gray_map(i)=(y2-y1)*(i-x1)/(x2-x1)+y1;
  else
     gray_map(i)=y1;
  end
end

for i=x1+1:x2  %判断x1到x2区间内的
  if(x2~=x1)
     gray_map(i)=(y2-y1)*(i-x1)/(x2-x1)+y1;
  else
     gray_map(i)=y1;
  end
end

for i=x2+1:256  %判断x2到255区间内的
  if(x2~=255)
     gray_map(i)=(255-y2)*(i-x2)/(255-x2)+y2;
  else
     gray_map(i)=255;
  end
end

for i=1:height
    for j=1:width
       T = image_matrix(i,j);
       if(T==0)
           G(i,j)=gray_map(1);
       else
           G(i,j)=gray_map(T);
       end
    end
end
image_out = uint8(G);
%显示
subplot(1,2,1);
imshow(image);
subplot(1,2,2);
imshow(image_out);

效果图

在这里插入图片描述

举报

相关推荐

0 条评论