Преобразование цветного изображения в изображение в градациях серого с использованием октавы - PullRequest
1 голос
/ 10 июня 2019

У меня есть цветное изображение, которое я пытаюсь преобразовать в оттенки серого, но я получаю сообщение об ошибке:

предупреждение: функция 'rgb2gray' принадлежит пакету изображений из Octave Forge, но имеетеще не реализовано

Я использую Octave 4.2.2 на 64-битной Ubuntu 18.04 и пока не могу обновить эту версию до Octave 5.1.

Есть ли обходной путь?

Моя цель:

  1. Чтобы преобразовать цветное изображение в оттенки серого.
  2. Затем поместите интенсивность / яркость каждого пикселя в оттенках серого в диапазон между 0-1.

Мой код:

pkg load image
% read image from url (I took  a random  image on internet)..
[url_img, map] = imread('http://i.imgur.com/9PDZb7i.png');
figure, imshow(url_img), title('Image from url')

% resize it..
resized_img1 = imresize(url_img, 0.2); % resize by a factor here 0.2
resized_img2 = imresize(url_img, [600 500]); % resize to a specific dimensions

% there are many ways of interpolation to perform resizing 
%resized_img3 = imresize(url_img, 0.2,'method','nearest'); % rsize by a specific interpolation method

figure, imshow(resized_img1), title('Resized image')

% change color did you mean from RGB to grayscale 
gray_img = rgb2gray(resized_img1);
figure, imshow(gray_img), title ('Grayscale image')

Ответы [ 3 ]

4 голосов
/ 10 июня 2019

Переустановите пакет изображений.У вас каким-то образом произошла неудачная установка.

Функция rgb2gray всегда была частью пакета образа.Это одна из функций, которая была там с самого начала 1007 *.

То, что произошло после версии 4.4, ядро ​​Octave также включает реализацию rgb2gray.Для поддержки как старых, так и новых версий Octave пакет образа проверяет, доступен ли rgb2gray во время установки.Если это так, он устанавливает свою собственную реализацию.Если нет, он ничего не делает и по умолчанию используется в ядре Octave.Если у вас установлены оба пакета образа и Octave 4.2, а rgb2gray недоступен, значит, вы каким-то образом испортили установку пакета образа.

Возможно, установка пакета образа выполнена с помощью версииOctave отличается от того, который вы используете?

Кроме того, рассмотрите возможность использования пакетов октав, которые предоставляются вашим системным менеджером пакетов, у которых не должно быть этой проблемы (apt install octave-image) после удаления тех, которые вы установили вручную.

2 голосов
/ 10 июня 2019

Согласно документации Octave на rgb2gray , преобразование выполняется следующим образом:

I = 0.298936*R + 0.587043*G + 0.114021*B

Таким образом, преобразование матрицы изображения 3D RGB в 2D-шкалу серого можно выполнить с помощью этого кода:

gray_img = (...
 0.298936 * resized_img1(:,:,1) +...
 0.587043 * resized_img1(:,:,2) +...
 0.114021 * resized_img1(:,:,3));

Когда вы вызываете imread, тогда пиксели являются целыми числами типа uint8, в этом случае вы можете округлить результат для большей точности, добавив 0.5:

gray_img = (...
 0.298936 * resized_img1(:,:,1) +...
 0.587043 * resized_img1(:,:,2) +...
 0.114021 * resized_img1(:,:,3) + 0.5);

Чтобы получить пиксели в диапазоне от 0-1, используйте im2double

1 голос
/ 10 июня 2019

Если RGB является изображением RGB (матрица размером [n,m,3]), то преобразование в серое изображение gray (массив [n,m]) выполняется путем взвешенного усреднения 3 цветовых каналов .

В зависимости от вашего приложения, лучшим подходом может быть вместо взятия только зеленого канала (это самый чувствительный канал, у ПЗС-матрицы в два раза больше зеленых пикселей, чем у синих или красных пикселей):

gray = rgb(:,:,2);

Простое невзвешенное среднее часто достаточно хорошо:

gray = mean(rgb,3);

Стандарт RGB Adobe D65 использует веса 0,2973769, 0,6273491 и 0,0752741 для красного, зеленого и синего ( источник ). Но я не знаю, какие веса используются реализацией MATLAB rgb2gray. Давайте предположим, что это те веса. Этот код вычисляет средневзвешенное значение:

[n,m] = size(rgb);
gray = reshape(rgb,[],3);
gray = gray * [0.30;0.63;0.07];
gray = reshape(gray,n,m);

В Octave вы можете написать его как однострочник:

gray = reshape(reshape(rgb,[],3) * [0.30;0.63;0.07], size(rgb)[1:2]);
...