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像素,看看它们是否是红色) - 但它应该大部分适合它裁剪的盒子.
你可以做一个 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)
对照明更不敏感的另一种方法是在转换为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%(水平),但在该区域的第一张图像中没有.
| 归档时间: |
|
| 查看次数: |
926 次 |
| 最近记录: |