使用直方图确定有色物体的存在?

Mat*_*lis 2 perl comparison imagemagick histogram

我试图确定图片的一部分是否包含红白条纹对象(liftramp).如果它存在,它看起来像这样:当下,当不是这样的时候: 没有

天真的方法是提取直方图,并计算红色像素是否多于蓝色/绿色像素:

use Image::Magick;

my $image = Image::Magick->new;
my $rv = $image->Read($picture);
#$rv = $image->Crop(geometry=>'26x100+484+40');

my @hist_data = $image->Histogram;
my @hist_entries;

# Histogram returns data as a single list, but the list is actually groups of 5 elements. Turn it into a list of useful hashes.
while (@hist_data) {
    my ($r, $g, $b, $a, $count) = splice @hist_data, 0, 5;
    push @hist_entries, { r => $r, g => $g, b => $b, alpha => $a, count => $count };
}

my $total=0;
foreach my $v (@hist_entries) {
        if ($$v{r}>($$v{g}+$$v{b})) { $total +=$$v{count}; }
}
Run Code Online (Sandbox Code Playgroud)

然后比较if $total > 10(任意阈值).虽然这对于相对阳光灿烂的日子似乎很好(给出50-180的存在而0-2但不存在),重云和黄昏使得检测总是说生命转换不存在.

我想必须有更聪明的方法来检测是否存在红白对象.那么问题是如何更可靠地进行检测?

请注意,灰色/绿色背景可能会随季节变化而变为灰褐色或其他东西.我也不能指望像素精度,因为它可能会移动一点(或者我只裁剪3-4像素,看看它们是否是红色) - 但它应该大部分适合它裁剪的盒子.

fmw*_*w42 6

你可以做一个 FFT 来获得每个图像的频谱。带有条纹的图像具有重复的图案,应该会出现在光谱中。使用 ImageMagick:

没有酒吧:

convert XqG0F.png -fft +delete -evaluate log 100000 without.png
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

带吧台:

convert x5hWF.png -fft +delete -evaluate log 100000 with.png
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明


fmw*_*w42 5

对照明更不敏感的另一种方法是在转换为HSV色彩空间后寻找红色色调.但由于红色与黑色/灰色/白色具有相同的0色调,我会反转图像,使红色变为青色.因此,在反转并转换为HSV后,对色调通道进行直方图分析,并在180度附近的青色色调或其等效的50%灰度或0到255范围内的128处查找值.在imagemagick中,你会这样做

convert XqG0F.png -negate -colorspace HSV -channel red -separate +channel -define histogram:unique-colors=false histogram:without_hist.png
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

convert x5hWF.png -negate -colorspace HSV -channel red -separate +channel -define histogram:unique-colors=false histogram:with_hist.png
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

因此,您可以在第二张图像中看到(对于红色条),中间附近有一个相当宽的峰值,即50%(水平),但在该区域的第一张图像中没有.