我使用MATLAB进行一系列实验,其中每只眼睛都受到来自图像的不同动机(双眼竞争)的刺激,就像一个是瓶子,另一个是手表。 有一个工具箱可以调整亮度和空间频率(Shine工具箱),但这对于背景简单透明的图像不起作用,例如.png / .tif / .bmp等。此外,保持透明的背景会得到包含在分析和匹配例程中,以便图像中心的对象仍然不能完美匹配。
在MATLAB(或GIMP)中是否有一种直接的方法来匹配一组灰度图像中的三个量(亮度,亮度,对比度)? 在GIMP中,我尝试通过“Levels”进行,但结果并不令人信服,因为每个图像的直方图都非常不同。是否可以设置预定义的模板直方图,根据该直方图可以匹配所有其他图像以使它们在三个量上相同?
提前致谢! DALIBOR
答案 0 :(得分: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
,然后使用调整后的值覆盖原始图像中的不透明部分。
答案 1 :(得分: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进行一些视觉心理学实验的人需要仔细控制目标参数,如配对图像的亮度(如双目竞争)。 此外,尽管每个像素共享相同的平均灰度值,但是一个图像的前景中的较大对象可以看起来比另一个图像的较小对象更暗(或更亮)。为此,我还将包括一些“间距”因子,它会对物体大小和它的明显亮度进行加权......