MATLAB图像处理2
由于只是为了粗略验证课上所学,代码的编写非常粗糙。存在无效的类型转换,缺乏归一化,大量使用循环以及胡乱命名等现象,还请见谅。
分段线性灰度变换
利用线性变化,对灰度级做出调整。当斜率大于1时,相当于提高该点的灰度级,也就是变亮。
做如图所示分段线性
dot_in=0:0.1:255;
for i = 1 : length(dot_in)
dot_out(i)=linear( dot_in(i)) ;
end
plot(dot_in,dot_out,'LineWidth',2);
title('k=3;k=0.125')
grid on ;
function out=linear(t)
if t <80
out= 3*t;
else
if t<160
out= t+160;
else
out=t/8+300;
end
end
end
直接做灰度变换
clc;
close all;
I=imread('me.jpg');
% 原灰度图
org=rgb2gray(I);
%改变数据类型
I=double(rgb2gray(I));
%矩阵大小
[x,y] = size(I);
% 做分段线性
for i = 1:x
for j=1:y
I(i,j)=linear( I(i,j));
end
end
%归一化
img=normal(I);
%绘图
figure (1)
subplot(1,2,1)
imshow(img,[]);
title('经过分段线性变换后')
subplot(1,2,2)
imshow(org,[]);
title('原灰度图')
% 线性化
function out=linear(t)
if t <80
out= 3*t;
else
if t<160
out= t+200;
else
out=t/8+340;
end
end
end
%归一化
function y=normal(img_dot)
[u,v] = size(img_dot);
img_dot=double(img_dot);
img_normal=double(zeros(u,v)) ;
max_dot=max(max(img_dot));
min_dot=min(min(img_dot));
distance=double(max_dot-min_dot) ;
for i = 1: u
for j =1:v
img_normal(i,j)= double ((img_dot(i,j)-min_dot)/distance*255);
img_normal(i,j)=round(img_normal(i,j));
img_normal(i,j)=min(img_normal(i,j),255);
img_normal(i,j)=max(img_normal(i,j),0);
end
end
y= (img_normal );
end
Gamma变换
此时gamma小于1,图像整体变亮。
clc;
close all;
I=imread('me.jpg');
% 原灰度图
org=rgb2gray(I);
%改变数据类型
I=double(rgb2gray(I));
%矩阵大小
[x,y] = size(I);
% 做非线性
gamma=0.3;
for i = 1:x
for j=1:y
I(i,j)=none_linear( I(i,j),gamma);
end
end
%归一化
img