输出是否在中值和均值滤波器中产生相同的图像

时间:2016-10-23 19:11:57

标签: matlab image-processing

我有两个问题。

首先,如果我将图像从RGB模型转换为HSI模型,图像的颜色是否会有所不同?

,其次,我在matlab中使用pepper.png图像,我的目标是首先将RGB图像转换为HSI模型。然后我必须在RGB模型和HSI模型中对同一图像使用中值和均值滤波器。完成所有这些之后,我发现当我在同一图像上使用均值滤波器但在HSI模型中使用均值滤波器对RGB模型时输出图像不等于输出图像...它是正确的输出吗?当在RGB模型中使用的图像以及在同一图像上但在HSI模型中使用时,均值滤镜是否会产生不同的图像?

1 个答案:

答案 0 :(得分:3)

回答第一个问题:
RGBHSI模型是不同的颜色空间 - (相同)相同颜色的不同数学表示 要在计算机显示器上显示图像,必须将其转换为sRGB颜色模型(也支持其他型号),但不能在HSI颜色空间中显示图像。
备注:不要担心RGB和sRGB的差异。 Matlab假设图像处于sRGB色彩空间(RGB和sRGB被认为相等)。

检查以下代码:

RGB = imread('peppers.png');
RGB = double(RGB)/255; %Convert pixels range [0, 255] to range [0, 1].
HSI = rgb2hsi(RGB);    %Convert RGB to HSI
RGB2 = hsi2rgb(HSI);   %Convert HSI back to RGB
max(abs(RGB(:) - RGB2(:))) %Calculate maximum absolute difference.

区别在于8.8818e-16 结论:将RGB转换为HSI并返回,不会改变颜色。

要执行代码,请下载:https://www.mathworks.com/matlabcentral/fileexchange/53354-hsi-%3C-%3E-rgb-image-conversion-tools

回答第二个问题:
NOT EQUAL是正确的,因为RGB到HSI的转换不是linear transformation 过滤R和G和B,与过滤H,S和I不同,并且转换回RGB(操作顺序很重要)。

"意味着过滤"没有明确定义。
我假设你的意思是在每个颜色通道上分别应用简单的3x3均值滤波器 请参阅:h ttps://www.mathworks.com/matlabcentral/answers/49226-how-to-apply-a-mean-filter-for-3x3

检查以下代码:

RGB = imread('peppers.png');
RGB = double(RGB)/255;
HSI = rgb2hsi(RGB);

h = 1/9*ones(3);

%Filter RGB and HSI images (convolution of each color plane with h).
filtRGB = imfilter(RGB, h);
filtHSI = imfilter(HSI, h);

%Convert filtered HSI to RGB format.
filtRGB2 = hsi2rgb(filtHSI);

max(abs(filtRGB(:) - filtRGB2(:)))

区别在于0.7774
结论:过滤RGB颜色空间和HSI颜色空间不等。

差异在哪里?

%Convert filtered RGB to HSI
filtHSI2 = rgb2hsi(filtRGB);

diffH = abs(filtHSI2(:,:,1) - filtHSI(:,:,1));
diffS = abs(filtHSI2(:,:,2) - filtHSI(:,:,2));
diffI = abs(filtHSI2(:,:,3) - filtHSI(:,:,3));

figure;imshow(diffH);title('diffH');impixelinfo
figure;imshow(diffS);title('diffS');impixelinfo
figure;imshow(diffI);title('diffI');impixelinfo

diffH:
enter image description here

DIFFS:
enter image description here

diffI:
enter image description here

结论:
H差异较大,S差异较小,I差异不大。

我之间没有区别的原因是因为I=(R+G+B)/3 I转换是线性转换(卷积是线性转换)。

例:
假设3x3像素
r00 r01 r02 g00 g01 g02 b00 b01 b02
r10 r11 r12 g10 g11 g12 b00 b01 b02
r20 r21 r22 g20 g21 g22 b00 b01 b02

首先过滤:
filtR =(r00 + r01 + r02 + r10 + r11 + r12 + r20 + r21 + r22)/ 9
filtG =(g00 + g01 + g02 + g10 + g11 + g12 + g20 + g21 + g22)/ 9
filtB =(b00 + b01 + b02 + b10 + b11 + b12 + b20 + b21 + b22)/ 9
转换为强度:
filtI2 =(filtR + filtG + filtB)/ 3
==> filtI2 =((r00 + r01 + r02 + r10 + r11 + r12 + r20 + r21 + r22)/ 9 +(g00 + g01 + g02 + g10 + g11 + g12 + g20 + g21 + g22)/ 9 +(b00 + B01 + B02 + B10 + B11 + B12 + B20 + B21 + B22)/ 9)/ 3
==> filtI2 =((r00 + r01 + r02 + r10 + r11 + r12 + r20 + r21 + r22)+(g00 + g01 + g02 + g10 + g11 + g12 + g20 + g21 + g22)+(b00 + b01 + b02 + b10 + b11 + b12 + b20 + b21 + b22))/ 27

首先转换为强度:
i00 =(r00 + g00 + b00)/ 3,i01 =(r01 + g01 + b01)/ 3,i02 =(r02 + g02 + b02)/ 3,... i22 =(r22 + g22 + b22)/ 3

过滤器I:
filtI =(i00 + i01 + i02 + ... + i22)/ 9
==> filtI =((r00 + g00 + b00)/ 3 +(r01 + g01 + b01)/ 3 + ... +(r22 + g22 + b22)/ 3)/ 9
==> filtI =((r00 + r01 + r02 + r10 + r11 + r12 + r20 + r21 + r22)+(g00 + g01 + g02 + g10 + g11 + g12 + g20 + g21 + g22)+(b00 + b01 + b02 + b10 + b11 + b12 + b20 + b21 + b22))/ 27

正如你可以看到filtI equlas filtI2(顺序并不重要)。

对H(Hue)尝试相同:
参见rgb2hsi.m中的H公式:
H(nz)=atan2(b(nz),a(nz))*(180/pi);
H(H<0)=H(H<0)+360;
H(~nz)=0;

现在尝试一些例子,看看filtH!= filtH2(顺序很重要)。