检测单个图像中的多个图像

2022-09-01 05:04:04

我需要帮助来识别边框并将图像与原始图像进行比较。我需要有关如何通过处理或matlab或任何初学者来实现这一目标的指导。例如,请看下图。

原始图像:

enter image description here

多图像: Larger Image


答案 1

您展示的“多图像”很容易使用简单的图像处理来处理,无需模板匹配:)

% read the second image
img2 = imread('http://i.stack.imgur.com/zyHuj.jpg');
img2 = im2double(rgb2gray(img2));

% detect coca-cola logos
bw = im2bw(img2);                                       % Otsu's thresholding
bw = imfill(~bw, 'holes');                              % fill holes
stats = regionprops(bw, {'Centroid', 'BoundingBox'});   % connected components

% show centers and bounding boxes of each connected component
centers = vertcat(stats.Centroid);
imshow(img2), hold on
plot(centers(:,1), centers(:,2), 'LineStyle','none', ...
    'Marker','x', 'MarkerSize',20, 'Color','r', 'LineWidth',3)
for i=1:numel(stats)
    rectangle('Position',stats(i).BoundingBox, ...
        'EdgeColor','g', 'LineWidth',3)
end
hold off

enter image description here


答案 2

您可以使用关联方法来定位多个图像:

file1='http://i.stack.imgur.com/1KyJA.jpg';
file2='http://i.stack.imgur.com/zyHuj.jpg';
It = imread(file1);
Ii = imread(file2);
It=rgb2gray(It);
Ii=rgb2gray(Ii);
It=double(It);  % template
Ii=double(Ii);  % image

Ii_mean = conv2(Ii,ones(size(It))./numel(It),'same');
It_mean = mean(It(:));
corr_1 = conv2(Ii,rot90(It-It_mean,2),'same')./numel(It);
corr_2 = Ii_mean.*sum(It(:)-It_mean);
conv_std = sqrt(conv2(Ii.^2,ones(size(It))./numel(It),'same')-Ii_mean.^2);
It_std = std(It(:));
S = (corr_1-corr_2)./(conv_std.*It_std);

imagesc(abs(S))

结果将为您提供具有最大值的仓位:

enter image description here

获取maxima的坐标,并将模板质心定位在同一位置,检查模板与匹配图像之间的差异。

我不确定你说的“识别边界”是什么意思,但你总是可以用精明的探测器提取边缘:

bw=edge(It);
bw=imfill(bw,'holes');
figure,imshow(bw)

推荐