Преобразувайте цветно изображение в скала на сивото в 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
comment
Нов съм в MATLAB и тази команда е сложна за мен, можете ли да използвате по-проста? - person Mohammad Farahi; 25.02.2014
comment
по-проста от една единствена функция? Какво?? - person Dan; 25.02.2014
comment
използвах това и се сблъсках с празно изображение !!! - person Mohammad Farahi; 25.02.2014
comment
Ако оригиналното ви изображение е uint8, тогава може да се наложи да го върнете към него. Ще редактирам. - person Dan; 25.02.2014
comment
Много ми помогна, благодаря. - person Mohammad Farahi; 25.02.2014
comment
С какво е свързана тази грешка? Грешка при използване на bsxfun Не се поддържат смесени входове на цели числа. - person Mohammad Farahi; 25.02.2014
comment
@MohammadFarahi, първо трябва да хвърлите I_colour на двойно, вижте моята редакция. Също така, моля, прочетете повече за typecasting. Това е добра отправна точка: mathworks.com/matlabcentral/answers/22785 -double-and-uint8 - person Dan; 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