Matlab之图像像素运算(五)

了解了基本的图像文件的读取处理操作之后,我们就要知道如何具体处理图像,让它变成我们想要的图片


点运算又称为对比度增强、对比度拉伸或灰度变换,是一种通过图像中的每一个像素值(即像素点上的灰度值)进行运算的图像处理方式。它将输入图像映射为输出图像,输出图像每个像素点的灰度值仅由对应的输入像素点的灰度值决定,运算结果不会改变图像内像素点之间的空间关系,其运算的数学关系式:
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

故可以写代码:

扫描二维码关注公众号,回复: 9684140 查看本文章
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);

在这里插入图片描述


像素的一些基本操作就学习到这里啦!继续加油哦~

发布了86 篇原创文章 · 获赞 197 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_44790423/article/details/104732367
今日推荐