我想知道给定的图像是否是matlab中另一个图像的精确或类似部分。
例如,检测板球视频帧中的分数栏。我想检测给定图像中是否显示分数栏。
1。更大的图像
2。另一张图片
第3。检查这是否是子图像
我想检查3是否是1的一部分。不是确切的部分。例如,即使分数栏存在于1中,并且它们不是相同的分数栏,也可以这样做。
我在尝试什么:
我试图将较大的图像分成小部分并拍摄图像的最后部分并计算与分数条图像的色调直方图差异。如果它低于某个阈值,我应该将其归类为更大图像的一部分。这是正确的方法还是应该遵循其他更好的方法。如果你有更好的,请建议我。
我编写的代码:
rgbImage = imread('img7517.jpg'); %bigger image
[r, c, x] = size(rgbImage);
numberOfBins = 256;
r1 = 6*r/7;
im = rgbImage(r1:r,:,1);
subplot(2,2,1);
imshow(im);
hsv = rgb2hsv(im);
h = hsv(:,:,1);
subplot(2,2,2);
hist(h(:), numberOfBins);
[counts, y] = hist(h(:), numberOfBins);
im1 = imread('scorebar.jpg'); %smaller image
subplot(2,2,3);
imshow(im1);
hsv = rgb2hsv(rgbImage);
h = hsv(:,:,1);
subplot(2,2,4);
hist(h(:), numberOfBins);
[count, y] = hist(h(:), numberOfBins);
c = sum(abs(counts(:) - count(:)));
disp(c);
但这并没有给我任何显着的1,3和2,3之间的直方图差异。 c
对1,3的值为72949,对于2,3为72875.我该怎么做?问题是由于代码还是方法?请帮我解决这个问题。
尝试规范化的互相关,
im1 = rgb2gray(imread('replay.jpg'));
im2 = rgb2gray(imread('scorebar1.jpg'));
c = normxcorr2(im2, im1);
[ypeak, xpeak] = find(c==max(c(:)));
yoffSet = ypeak-size(im1,1);
xoffSet = xpeak-size(im1,2);
hFig = figure;
hAx = axes;
imshow(im2,'Parent', hAx);
imrect(hAx, [xoffSet, yoffSet, size(im1,2), size(im1,1)]);
关注this link。但是没有给出类似的分析。
答案 0 :(得分:0)
这类问题(在较大图像中查找目标图像)称为template matching。通常,您可以使用normalised cross-correlation,但根据您的要求和特定用例,有各种不同的算法。
不幸的是,正如您已经观察到的那样,基于家酿直方图的算法可能不会给出非常好的结果,因此您可能需要尝试上面链接的文章中描述的常用方法之一
答案 1 :(得分:0)
解决方案,我知道了,
im1 = rgb2gray(imread('img1.jpg'));
im2 = rgb2gray(imread('scorebar.jpg'));
[r, c, x] = size(rgbImage);
numberOfBins = 256;
r1 = 6*r/7;
im1 = im1(r1:r,:,1);
[counts, y] = imhist(im1, numberOfBins);
[count, y] = imhist(im2, numberOfBins);
c = sum(abs(counts(:) - count(:)));
disp(c);
这给出了直方图之间的显着色调直方图差异(HHD)。具有分数栏的图像具有2000-5000的HHD,没有分数栏的图像具有HHD> 1。 10000