我有一张要转换为灰度的彩色图像,但出现错误:
警告:“ rgb2gray”功能属于Octave Forge的图片包,但尚未实现
我在64位Ubuntu 18.04上使用Octave 4.2.2,还不能将此版本升级到Octave 5.1。
有解决方法吗?
我的目标是:
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')
答案 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);
Adobe 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