我有我想转换为灰度的彩色图像,但我得到一个错误:
警告:“rgb2gray”功能属于从八度伪造图像软件包,但尚未实施
我在Ubuntu使用倍频程4.2.2 18.04 64位和无法升级此版本倍频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')
据对倍频文档rgb2gray ,如下转换完成:
I = 0.298936*R + 0.587043*G + 0.114021*B
因此,一个三维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
重新安装图像包。 你不知何故有一个拙劣的安装。
该功能rgb2gray
一直是图像软件包的一部分。 这是已经存在,因为其中一个功能很启动 。
现在的情况是,自从4.4版本,倍频核心还包括一个实现rgb2gray
。 为了支持新老版本的八度,图像包检查rgb2gray
安装过程中是可用的。 如果是的话,它会安装它自己的实现。 如果不是,它什么也不做,并默认为八度的核心执行。 如果你有两个形象包装和安装倍频4.2,而rgb2gray
不可用,那么你莫名其妙地打乱你的图像包的安装。
是您的映像包的安装可能与正在运行的一个不同版本的八度做了什么?
此外,考虑使用你的系统包管理器中提供的倍频包不应该有这个问题( apt install octave-image
卸载手动安装的那些后)。
如果RGB
是RGB图像(大小的矩阵[n,m,3]
然后转换为灰度图像gray
(阵列[n,m]
是由3个颜色通道的加权平均来实现)。
根据您的应用程序,最好的办法可能是,而不是采取只绿色通道(这是最敏感的,CCD具有两倍多的绿色像素比蓝色或红色像素):
gray = rgb(:,:,2);
一个简单的非加权平均值是不够经常性好:
gray = mean(rgb,3);
Adobe的D65标准RGB使用的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);
在八度,你可以把它写成一个班轮:
gray = reshape(reshape(rgb,[],3) * [0.30;0.63;0.07], size(rgb)[1:2]);