【问题标题】:Matlab: index must be a positive integer or logicalMatlab:索引必须是正整数或逻辑
【发布时间】:2014-09-04 01:46:21
【问题描述】:

我为彩色图像的直方图均衡编写了代码。该代码适用于灰度图像,但它会引发彩色图像错误。我正在将 rgb 图像转换为 hsv,然后执行直方图均衡。有什么想法吗?

代码:

%  GIm=imread('tire.tif'); this is grayscale image, which works fine
I=imread('D:\came.jpg');
GIm=rgb2hsv(I);% converting color image to hsv
numofpixels=size(GIm,1)*size(GIm,2);
figure,imshow(GIm);
title('Original Image');
HIm=uint8(zeros(size(GIm,1),size(GIm,2)));
freq=zeros(256,1);
probf=zeros(256,1);
probc=zeros(256,1);
cum=zeros(256,1);
output=zeros(256,1);
%freq counts the occurrence of each pixel value.
%The probability of each occurrence is calculated by probf.
for i=1:size(GIm,1)
    for j=1:size(GIm,2)
        value=GIm(i,j);
        freq(value+1)=freq(value+1)+1; % giving error here 
        probf(value+1)=freq(value+1)/numofpixels;
    end

end

sum=0;
no_bins=255;
%The cumulative distribution probability is calculated. 
for i=1:size(probf)
   sum=sum+freq(i);
   cum(i)=sum;
   probc(i)=cum(i)/numofpixels;
   output(i)=round(probc(i)*no_bins);
end

for i=1:size(GIm,1)
    for j=1:size(GIm,2)
            HIm(i,j)=output(GIm(i,j)+1);
    end
end

figure,imshow(HIm);
title('Histogram equalization');
subplot(2,2,2); 
plot(GIm);
%bar(GIm);
title('Before Histogram equalization');
subplot(2,2,4);
plot(HIm)
%bar(HIm);
title('After Histogram equalization');

错误:

Attempted to access freq(1.61378); index must be a positive integer or logical.

Error in histogramequ (line 18)
        freq(value+1)=freq(value+1)+1;

【问题讨论】:

  • James - 仔细查看 HSV 图像,GIm。在命令行窗口中输入class(GIm)max(GIm(:))。您可能会注意到 HSV 数据类型(类)是 double 并且最大值是 1。因此所有像素值都在区间 [0,1] 中,并且错误消息使感觉。还要检查 RGB 和 HSV 图像的尺寸。与灰度图像的二维不同,可能存在三个维度。您的代码可能需要更新以处理此问题。
  • 我不确定您将如何创建直方图 - 可能每个(HSV 图像的)色调、饱和度和值分量将 [0,1] 区间拆分为固定数字箱。例如,[0,0.1), [0.1, 0.2), ...,[0.8,0.9), [0.9,1] 可能是您尝试“填充”的十个箱子。尽管您可能想要更多(这只是一个示例)。

标签: matlab image-processing histogram


【解决方案1】:

你的代码的主要问题是在rgb2hsv()之后,每个像素的格式是[0,1]中的double,而不是uint8。所以你需要转换回 [0,255] 以便它可以用作下标。

以下代码将正常工作。

for i=1:size(GIm,1)
    for j=1:size(GIm,2)
        value=floor(GIm(i,j) * 255);  % now value is in [0,255]
        freq(value+1)=freq(value+1)+1;
        probf(value+1)=freq(value+1)/numofpixels;
    end
end

【讨论】:

    猜你喜欢
    • 2016-06-12
    • 2012-11-27
    • 2013-12-04
    • 1970-01-01
    • 2021-01-18
    • 1970-01-01
    • 2021-07-02
    • 2012-12-29
    • 2014-09-25
    相关资源
    最近更新 更多