3

我使用 MATLAB 进行了一系列实验,每只眼睛都受到与图像不同的刺激(双眼竞争),就像一个是瓶子,另一个是手表。有一个工具箱可以调整亮度和空间频率(Shine 工具箱),但这不适用于背景简单透明的图像,如 .png/.tif/.bmp 等。此外,应保持透明的背景会得到包含在分析和匹配例程中,因此图像中心的对象仍然不能完美匹配。

MATLAB(或 GIMP)中是否有一种简单的方法来匹配一组灰度图像中的三个量(亮度、亮度、对比度)?在 GIMP 中,我尝试通过“级别”来实现,但结果令人信服,因为每个图像的直方图都非常不同。是否可以设置一个预定义的模板直方图,根据该直方图可以匹配所有其他图像以使三个数量的它们相同?

提前致谢!达利博尔

4

2 回答 2

3

在 Matlab 中,如果您只想匹配图像的不透明部分,您可以将不透明部分提取为一维图像,将其传递给工具箱函数,然后将图像重新转换回其原始形状。

假设您有一张带有 RGBA 信息的图像,其中 A=1 是完全不透明的。然后你可以像这样转换图像:

opaqueIdx = imgRGBA(:, :, 4) == 1; 
imgOpaque = zeros(sum(opaqueIdx(:)), 1, 3); 
for color = 1:3
   myColor = imgRGBA(:, :, color); 
   imgOpaque(:, :, color) = myColor(opaqueIdx); 
end

imgOpaque然后可以调整,然后用调整后的值覆盖原始图像中的不透明部分。

于 2012-12-15T16:18:31.393 回答
0

幸运的是,我在研究了图像矩阵的细节后想出了一个解决方案。这是我得到的:我只是将每个灰度图像的所有灰度值相加,例如两个灰度图像,并将这个总和除以具有非零灰度值的像素数(因为透明背景被排除在匹配例程之外) . 这给出了图像中前景像素的平均灰度值。先决条件(我的研究需要)是图像必须具有相同的尺寸 r1 x c1 = r2 x c2 并且它们具有均匀透明的背景。

该循环将具有非 255(或者非零)灰度值的所有像素的所有像素灰度值相加,给出总前景亮度。r = 行,c = 列,I1 = 图像 1,I2 = 图像 2;当然,必须通过“imread”操作读取两张图像。

for i = 1:r
    n = 1;
    while n <= c
        if I1(i,n,1)<255
            B1 = [B1, I1(i,n,1)];
        end
        if I2(i,n,1)<255 
            B2 = [B2, I2(i,n,1)];
        end
        n=n+1;
    end
end

TotBI1 = sum(B1);
TotBI2 = sum(B2);

在这里,计算两个图像的灰度值均非零(或非 255)的像素数(如上面循环中所选择的):

PixNr1 = length(B1);
PixNr2 = length(B2);

确定具有非零(或非 255)灰度值的每个像素的平均亮度(这也可以通过“平均”操作来完成):

BPixAvg1 = TotBI1/PixNr1;
BPixAvg2 = TotBI2/PixNr2;

最后,用DeltaB对所有非255灰度值的像素进行修改,即均衡(或折衷)灰度值;灰度值较暗的图像前景在 DeltaB 下变得更亮,而较亮的图像前景在 DeltaB 下变得更暗:

DeltaB = (BPixAvg1 - BPixAvg2)/2;

for i = 1:r
    n=1;
    while n<=c
        if I1(i,n,1)<255
            I1(i,n,1:3) = I1(i,n,1:3)-DeltaB;
        end
        if I2(i,n,1)<255
            I2(i,n,1:3) = I2(i,n,1:3)+DeltaB;
        end
        n=n+1;
    end
end

end

我将尝试概括各种图像的代码,因为一些使用 MATLAB PsychToolbox 进行一些视觉心理实验的人需要仔细控制客观参数,例如成对图像的亮度(例如用于双目竞争)。此外,尽管每个像素共享相同的平均灰度值,但一个图像前景中的较大对象可能比另一张图像的较小对象显得更暗(或更亮)。为此,我还将包括一些“间距”因素,它加权对象大小和它的表观亮度......

于 2012-12-16T14:27:58.437 回答