使用八度将彩色图像转换为灰度图像

时间:2019-06-10 12:07:20

标签: image octave

我有一张要转换为灰度的彩色图像,但出现错误:

  

警告:“ rgb2gray”功能属于Octave Forge的图片包,但尚未实现

我在64位Ubuntu 18.04上使用Octave 4.2.2,还不能将此版本升级到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')

4 个答案:

答案 0 :(得分:4)

重新安装映像包。您以某种方式进行了拙劣的安装。

函数rgb2gray一直是映像包的一部分。这是very start以来一直存在的功能之一。

发生的事情是,自版本4.4起,八度内核也包含了rgb2gray的实现。为了同时支持旧版本和新版本的Octave,映像包将检查rgb2gray在安装过程中是否可用。如果是这样,它将安装自己的实现。如果不是,则不执行任何操作,并且默认为Octave核心中的实现。如果同时安装了映像包和Octave 4.2,并且rgb2gray不可用,那么您将以某种方式弄乱了映像包的安装。

您是否可以使用与运行的Octave版本不同的Octave版本安装映像包?

此外,请考虑使用系统软件包管理器提供的八度软件包,在卸载手动安装的软件包后,这些软件包应该没有此问题(apt install octave-image)。

答案 1 :(得分:2)

根据rgb2gray上的Octave文档,转换如下:

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

答案 2 :(得分:1)

如果RGB是RGB图像(大小为[n,m,3]的矩阵),则转换为灰度图像gray[n,m]的数组)可以通过3个颜色通道的加权平均值。

根据您的应用程序,最好的方法可能是仅采用绿色通道(这是最敏感的通道,CCD的绿色像素是蓝色或红色像素的两倍):< / p>

gray = rgb(:,:,2);

简单的非加权平均值通常就足够了:

gray = mean(rgb,3);

Adob​​e D65标准RGB对红色,绿色和蓝色(source)使用的权重为0.2973769、0.6273491和0.0752741。但是我不知道rgb2gray的MATLAB实现使用了什么权重。假设是这些重量。这段代码计算加权平均值:

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

在八度中,您可以将其写为单线:

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

答案 3 :(得分:1)

如果要编写函数,请创建新函数convgray.m,然后粘贴

function[G] = convgray(F)
rgb=double(F);
[height,width,c] = size(rgb);
gray = reshape(rgb,[],3);
gray = gray * [0.30;0.63;0.07];
gray = reshape(gray,height,width);
gray=uint8(gray);
imshow(gray)

然后在命令窗口中键入

>> image = imread('yourimage.jpg');
>> convgray(image)

它将正确显示您的灰度图像 here's my output