了解了基本的图像文件的读取处理操作之后,我们就要知道如何具体处理图像,让它变成我们想要的图片
点运算又称为对比度增强、对比度拉伸或灰度变换,是一种通过图像中的每一个像素值(即像素点上的灰度值)进行运算的图像处理方式。它将输入图像映射为输出图像,输出图像每个像素点的灰度值仅由对应的输入像素点的灰度值决定,运算结果不会改变图像内像素点之间的空间关系,其运算的数学关系式:
B(x,y)= f[A(x,y)]
其中A(x,y)表示原图像,表示B(x,y)经过点运算处理后的图像,f()表示点运算的关系函数。
按照灰度变换的数学关系点运算可以分为线性灰度变换、分段线性灰度变换和非线性灰度变换三种。
线性灰度变换
下面以一段代码来举例:
gamma = 0.5;
I = imread('lena_color_512.tif');
R = I;
R(: ,: ,2) = 0; %去掉绿色
R(: ,: ,3) = 0; %去掉蓝色 结果为保留红色
R1 = imadjust(R, [0.5 0.8], [0 1], gamma); %调整R的灰度
G = I;
G(: ,: ,1) = 0; %去掉红色
G(: ,: ,3) = 0; %去掉蓝色 结果为保留绿色
G1 = imadjust(G, [0 0.3], [0 1], gamma); %调整G的灰度
B = I;
B(: ,: ,1) = 0; %去掉红色
B(: ,: ,2) = 0; %去掉绿色 结果为保留蓝色
B1 = imadjust(B, [0 0.3], [0 1], gamma); %调整B的灰度
I1 = R1+ G1 + B1; %变换后的RGB图像;
set(0, 'defaultFigurePosition', [100, 100, 1000, 500]); %修改图像位置的默认设置
set(0, 'defaultFigureColor', [1 1 1]); %修改图形背景颜色的设置
figure(1)
subplot(121), imshow(R);
subplot(122), imshow(R1);
figure(2)
subplot(121), imshow(G);
subplot(122), imshow(G1);
figure(3)
subplot(121), imshow(B);
subplot(122), imshow(B1);
figure(4)
subplot(121), imshow(I);
subplot(122), imshow(I1);
输出结果如下:
图一:
对红色进行灰度调整,原图像灰度范围为0-255,即将2550.5以下的设定为0,2550.8以上的设定为1,右边为灰度调整后的结果
图二:
对绿色进行灰度调整,即将2550以下的设定为0,2550.3以上的设定为1,右边为灰度调整后的结果
图三:
对蓝色进行灰度调整,即将2550以下的设定为0,2550.3以上的设定为1,右边为灰度调整后的结果,可以看到灰度设定范围过小,且蓝色本身像素过少,导致图形很模糊
图四:
左边为未处理过的原图,右边为以上三种灰度变换后结果相加后的情况
那我们就可以知道实际上我们通过设定RGB各分量的值,就可以得到我们想要的灰度图效果了,他们满足这样一个式子
G r a y = R ∗ 0.299 + G ∗ 0.587 + B ∗ 0.114 Gray = R*0.299 + G*0.587 + B*0.114 Gray=R∗0.299+G∗0.587+B∗0.114
故可以写代码:
I = imread('lena_color_512.tif');
R = I(:, :,1);
G = I(:, :,2);
B = I(:, :,3);
Gray = R*0.299 + G*0.587 + B*0.114 ;
figure, imshow(Gray)
可以看到这张图和我们的灰度图效果是一样的!
分段线性灰度变换
我们可以通过将不同的像素区间内的像素值设定为一个新值,达到我们的目的。
先看代码:
R = imread('lena_color_512.tif');
J = rgb2gray(R); %转换为灰度图像
[M, N] = size(J); %得到行列数M N
x = 1; y = 1;
for x=1 : M
for y = 1 : N
if ( J(x,y) <= 35)
H(x,y) = J(x,y)*10;
elseif( J(x,y)>35 && J(x,y)<=75)
H(x,y) = (10/7)*[J(x,y)-5]+50;
else
H(x,y) = (105/180)*[J(x,y)-75]+150;
end
end
end
set(0, 'defaultFigurePosition', [100, 100, 1000, 500]); %修改图像位置的默认设置
set(0, 'defaultFigureColor', [1 1 1]); %修改图形背景颜色的设置
subplot(121), imshow(J);
subplot(122), imshow(H);
结果如下:
非线性灰度变换
我们可以通过特定的函数操作,对所有的像素点进行一个对数操作,得到新的效果图
R = imread('lena_color_512.tif');
G = rgb2gray(R);
J = double(G);
H = (log(J+1))/10; %基于对数的非线性灰度变换
set(0, 'defaultFigurePosition', [100, 100, 1000, 500]); %修改图像位置的默认设置
set(0, 'defaultFigureColor', [1 1 1]); %修改图形背景颜色的设置
subplot(121), imshow(G);
subplot(122), imshow(H);
像素的一些基本操作就学习到这里啦!继续加油哦~