Применение фильтра изображений Matlab к изображениям RGB

У меня есть следующий код Matlab для управления двумя изображениями, серой шкалой и RGB образ. Дело в том, чтобы применить Average,Gaussian, а также Laplacian фильтры на обоих изображениях.

%%Clear
clear
clc
%%Reading images
gray=imread('cameraman.tif')
[gray_table gray_map]=gray2ind(gray,256)
rgb=imread('peppers.png')
[rgb_table rgb_map]=rgb2ind(rgb,256)
%%Creating filters
average=fspecial('average',3)
gaussian=fspecial('gaussian',3,0.5)
laplacian=fspecial('laplacian',0.9)
%%Applying filters
average_filterd_gray_table=imfilter(gray_table,average)
gaussian_filterd_gray_table=imfilter(gray_table,gaussian)
laplacian_filterd_gray_table=imfilter(gray_table,laplacian)
average_filterd_rgb_table=imfilter(rgb_table,average)
gaussian_filterd_rgb_table=imfilter(rgb_table,gaussian)
laplacian_filterd_rgb_table=imfilter(rgb_table,laplacian)
%%view
figure
subplot(1,4,1),imshow(gray_table,gray_map),title('Original Indexed Gray')
subplot(1,4,2),imshow(average_filterd_gray_table,gray_map),title('Average Filtered Indexed Gray')
subplot(1,4,3),imshow(gaussian_filterd_gray_table,gray_map),title('Gaussian Filtered Indexed Gray')
subplot(1,4,4),imshow(laplacian_filterd_gray_table,gray_map),title('Laplacian Filtered Indexed Gray')
figure
subplot(1,4,1),imshow(rgb_table,rgb_map),title('Original Indexed RGB')
subplot(1,4,2),imshow(average_filterd_rgb_table,rgb_map),title('Average Filtered Indexed RGB')
subplot(1,4,3),imshow(gaussian_filterd_rgb_table,rgb_map),title('Gaussian Filtered Indexed RGB')
subplot(1,4,4),imshow(laplacian_filterd_rgb_table,rgb_map),title('Laplacian Filtered Indexed RGB')

Код работает нормально для изображения в оттенках серого. но на изображении RGB это только дает искаженный результат. Как это исправить?

3 ответа

Решение

Согласно документу для rgb2ind (нажмите здесь):

при загрузке изображения RGB примерно так:

[X,map] = rgb2ind(RGB,n)Док говорит:

Примечание Значения в результирующем изображении X являются индексами в карте цветовой карты и не должны использоваться в математической обработке, такой как операции фильтрации.

Так что, возможно, вам лучше отфильтровать напрямую изображения RGB. Следующее работает отлично:

clear
clc
close all

RGBImage = imread('peppers.png');

average = fspecial('average',3);
gaussian=fspecial('gaussian',3,0.5);
laplacian=fspecial('laplacian',0.9);

RGB_Average = imfilter(RGBImage,average);
RGB_Gaussian= imfilter(RGBImage,gaussian);
RGB_Laplacian = imfilter(RGBImage,laplacian);

figure;
subplot(2,2,1)
imshow(RGBImage)
title('Original')

subplot(2,2,2)
imshow(RGB_Average)
title('Average')

subplot(2,2,3)
imshow(RGB_Gaussian)
title('Gaussian')

subplot(2,2,4)
imshow(RGB_Laplacian)
title('Laplacian')

что дает это:

Вы читаете изображение следующим образом:

rgb=imread('peppers.png')
[rgb_table rgb_map]=rgb2ind(rgb,256);

При этом вы можете применить фильтр, потому что способ, которым вы применили, внес некоторые изменения в цвета изображения:

[rgb_table rgb_map]=imread('peppers.png')
average=fspecial('average',3);
gaussian=fspecial('gaussian',3,0.5);
laplacian=fspecial('laplacian',0.9);
average_filterd_rgb_table=imfilter(rgb_table,average);
gaussian_filterd_rgb_table=imfilter(rgb_table,gaussian);
laplacian_filterd_rgb_table=imfilter(rgb_table,laplacian);
subplot(2,2,1),imshow(rgb),title('Original Indexed RGB')
subplot(2,2,2),imshow(average_filterd_rgb_table),title('Average Filtered Indexed RGB')
subplot(2,2,3),imshow(gaussian_filterd_rgb_table),title('Gaussian Filtered Indexed RGB')
subplot(2,2,4),imshow(laplacian_filterd_rgb_table),title('Laplacian Filtered Indexed RGB')

Это изображение, которое я получаю:

Я думаю, вам не нужно использовать gray2ind а также rgb2indПосмотрите, работает ли это.

gray=imread('cameraman.tif');
rgb=imread('peppers.png');
%%Creating filters
average=fspecial('average',3);
gaussian=fspecial('gaussian',3,0.5);
laplacian=fspecial('laplacian',0.9);
%%Applying filters
average_filterd_gray=imfilter(gray,average);
gaussian_filterd_gray=imfilter(gray,gaussian);
laplacian_filterd_gray=imfilter(gray,laplacian);
average_filterd_rgb=imfilter(rgb,average);
gaussian_filterd_rgb=imfilter(rgb,gaussian);
laplacian_filterd_rgb=imfilter(rgb,laplacian);
%%view
figure
subplot(2,2,1),imshow(gray),title('Original Indexed Gray')
subplot(2,2,2),imshow(average_filterd_gray),title('Average Filtered Indexed Gray')
subplot(2,2,3),imshow(gaussian_filterd_gray),title('Gaussian Filtered Indexed Gray')
subplot(2,2,4),imshow(laplacian_filterd_gray),title('Laplacian Filtered Indexed Gray')
figure
subplot(2,2,1),imshow(rgb),title('Original Indexed RGB')
subplot(2,2,2),imshow(average_filterd_rgb),title('Average Filtered Indexed RGB')
subplot(2,2,3),imshow(gaussian_filterd_rgb),title('Gaussian Filtered Indexed RGB')
subplot(2,2,4),imshow(laplacian_filterd_rgb),title('Laplacian Filtered Indexed RGB')
Другие вопросы по тегам