我有大约160张图片用于实验。然而,与其他图像相比,一些图像具有明显不同的亮度和对比度。例如,我有类似下面两张图片的内容:
我想在亮度和对比度方面对两张图片进行均衡(可能在中间找到一些级别而不是将一张图像等同于另一张图片 - 尽管如果这样可以让事情变得更容易就可以了)。有人会对如何解决这个问题有任何建议吗?我对Matlab中的图像分析并不熟悉,所以请关注我的后续问题。这里有Equalizing luminance, brightness and contrast for a set of images的问题,但代码对我来说没有多大意义(由于我缺乏使用Matlab处理图像的经验)。
目前,我使用Gimp来处理图像,但是耗费了160张图像,并且只是主观的眼睛判断也不是很可靠。谢谢!
答案 0 :(得分:2)
您可以使用histeq
执行直方图规范,其中算法将尽力使目标图像与源图像的强度/直方图的分布相匹配。这也称为histogram matching and you can read up about it on my previous answer。
实际上,两幅图像之间的强度分布应该是相同的。如果要使用histeq
来利用此功能,可以指定另一个指定目标直方图的参数。因此,输入图像将尝试将其自身与目标直方图匹配。假设您将图像存储在im1
和im2
:
out = histeq(im1, imhist(im2));
但是,imhistmatch
是更好的版本。这与您拨打histeq
的方式几乎相同,除非您不必手动计算直方图。您只需指定实际图像以匹配自身:
out = imhistmatch(im1, im2);
这是使用两张图片的运行示例。请注意,我会选择使用imhistmatch
。我直接从StackOverflow读取这两个图像,我执行直方图匹配,以便第一个图像与第二个图像的强度分布匹配,我们在一个窗口中显示这个结果。
im1 = imread('http://i.stack.imgur.com/oaopV.png');
im2 = imread('http://i.stack.imgur.com/4fQPq.png');
out = imhistmatch(im1, im2);
figure;
subplot(1,3,1);
imshow(im1);
subplot(1,3,2);
imshow(im2);
subplot(1,3,3);
imshow(out);
这就是我得到的:
请注意,第一张图片现在或多或少与第二张图片的分布相匹配。
我们也可以翻转它并将第一张图像作为源,我们可以尝试将第二张图像与第一张图像匹配。只需使用imhistmatch
翻转两个参数:
out = imhistmatch(im2, im1);
重复上面的代码来显示图,我明白了:
看起来更有趣。我们绝对可以看到第二张图像眼睛的形状,而且一些面部特征更加明显。
因此,你最终可以做的是选择一个具有最佳亮度和对比度的良好代表性图像,然后遍历其他每个图像并每次使用此源图像调用imhistmatch
参考使得其他图像将尝试匹配它们的强度分布到该源图像。我无法为此编写代码,因为我不知道如何在MATLAB中存储这些图像。如果你分享一些代码,我会喜欢写更多。