Преобразование цветного изображения в оттенки серого в MATLAB без rgb2gray

Я хочу преобразовать свое цветное изображение в оттенки серого и не использовать команду rgb2gray.


person Mohammad Farahi    schedule 25.02.2014    source источник


Ответы (3)


Итак:

I_grey = mean(I_colour, 3);

Возможно, вам может понадобиться преобразовать его в uint8, прежде чем вы сможете его просмотреть:

I_grey = uint8(mean(I_colour, 3));

Или, если вы хотите быть действительно точным, вы должны найти средневзвешенное значение. См. ответ на этот вопрос для параметров взвешивания: Формула для определения яркости цвета RGB< /а>

Вот пример этого:

W = permute([0.3086, 0.6094, 0.0820], [3,1,2]);
I_grey = uint8(sum(bsxfun(@times, double(I_colour), W),3));
person Dan    schedule 25.02.2014

Вот некоторые изменения в ответе Дэна и дополнительные материалы, чтобы ответить на ваш вопрос.

Код -

%// Load image
I_colour = imread('pic1.jpg');

%// Dan's method with the correct (correct if you can rely on MATLAB's paramters,
%// otherwise Dan's mentioned paramters could be correct, but I couuldn't verify)
%//  parameters** as listed also in RGB2GRAY documentation and at - 
%// http://www.mathworks.com/matlabcentral/answers/99136
W = permute([0.2989, 0.5870, 0.1140], [3,1,2]);  
I_grey = sum(bsxfun(@times, double(I_colour), W),3);

%// MATLAB's in-built function
I_grey2 = double(rgb2gray(I_colour));

%// Error checking between our and MATLAB's methods
error = rms(abs(I_grey(:)-I_grey2(:)))

figure, 
subplot(211),imshow(uint8(I_grey));
subplot(212),imshow(uint8(I_grey2));

Ребята из Mathworks прекрасно ответили на этот вопрос с помощью простого для понимания кода по адресу - http://www.mathworks.com/matlabcentral/answers/99136

person Divakar    schedule 25.02.2014

Функция rgb2gray устраняет оттенок и насыщенность и сохраняет информацию о светимости (яркости).

Таким образом, вы можете преобразовать пиксель, расположенный в точках i и j, в оттенки серого, используя следующую формулу.

Формула

grayScaleImage(i,j) = 0.298*img(i,j,1)+0.587*img(i,j,2)+0.114*img(i,j,3) 

img(i,j,1) — значение КРАСНОГО пикселя.

img(i,j,2) — значение ЗЕЛЕНОГО пикселя.

img(i,j,3) — значение СИНЕГО пикселя.

grayScaleImage(i,j) — значение пикселя в оттенках серого в диапазоне [0..255]

Псевдокод

img = imread('example.jpg');
[r c colormap] = size(img);
for i=1:r
 for j=1:c
  grayScaleImg(i,j) = 0.298*img(i,j,1)+0.587*img(i,j,2)+0.114*img(i,j,3);
 end 
end
imshow(grayScaleImg);
person Shubham Agrawal    schedule 06.11.2016