我正在实现图像的直方图均衡化,而不使用内置函数,特别是imhist
和histeq
。我只允许使用cumsum
和hist
或histcounts
。我有一个测试功能,可以检查我的代码中是否添加了供参考的不同值。
这是我的代码:
function eq_img = histeq_contrast(img)
%input image data is assumed to be in range 0..1
image = img;
[m,n] = size(image);
L = 256;
H = histcounts(image(:),(0:256));
H = H.';
[counts] = H;
x = 0:255;
myCDF = cumsum(counts)/(m*n);
eqI = (L-1)*myCDF(double(image)+1);
eqI = uint8(eqI);
histMyOutput = histcounts(eqI,256);
eq_img = histMyOutput;
这是生成的错误消息
Array indices must be positive integers or logical values.
Error in histeq_contrast (line 22)
eqI = (L-1)*myCDF(double(image)+1);
Error in histeq_test (line 16)
I1eq = histeq_contrast(I1);
作为参考,我的测试功能是:
%histeq_test test script%
I1 = imread('pout.tif');
I1=im2double(I1);
% damage contrast
I1=0.8*I1;
I1eq = histeq_contrast(I1);
figure
subplot(1,2,1);
imagesc(I1); caxis([0 1]); title('Test Image 1'); axis equal tight
subplot(1,2,2);
imagesc(I1eq); caxis([0 1]); title('Histeq Result'); axis equal tight
colormap(gray);
fprintf(1,'Min/max of input image 1: %3.3f %3.3f\n', min(I1(:)),max(I1(:)) );
fprintf(1,'Min/max of output image 1: %3.3f %3.3f\n', min(I1eq(:)),max(I1eq(:)) );
% damage contrast
I2 = I1*0.25 + 0.25;
I2eq = histeq_contrast(I2);
figure
subplot(1,2,1);
imagesc(I2); caxis([0 1]); title('Test Image 2'); axis equal tight
subplot(1,2,2);
imagesc(I2eq); caxis([0 1]); title('Histeq Result'); axis equal tight
colormap(gray);
fprintf(1,'Min/max of input image 2: %3.3f %3.3f\n', min(I2(:)),max(I2(:)) );
fprintf(1,'Min/max of output image 2: %3.3f %3.3f\n', min(I2eq(:)),max(I2eq(:)) );
答案 0 :(得分:1)
您输入的图像是:
I1 = imread('pout.tif');
I1=im2double(I1);
% damage contrast
I1=0.8*I1;
在im2double
之后,I1
包含0-1范围内的值。在您的histeq_contrast
函数中,在收到错误消息的行上,您使用以下图像进行索引:
eqI = (L-1)*myCDF(double(image)+1);
因此,如错误消息所示,您正在非整数位置建立索引。 (此外,不必转换为double
,因为它已经翻倍了。)正确的是:
eqI = (L-1)*myCDF(round(image*255)+1);
或者,不要使用im2double
。