2017-03-28 148 views
0

我想知道如何检测手工制作的纸张正方形的右下角(这可能不是完全正方形的,因为我自己绘制了它)在另一个物体的顶部。我想要做的就是使用这个方块作为参考,并根据方块的右下角对齐图像。我是一个Matlab业余爱好者。任何人都可以帮忙吗?如何检测部分矩形并使用Matlab对齐图像?

左上角的正方形是纸张正方形,我需要检测哪个是参考点。

Example image with square at top left

回答

0

你有很多的选择,检测方;它实际上是一个矩形;你想检测,但最简单的方法是使用形态学操作。在这里我提供了一个评论脚本来帮助你;因为你是一个MATLAB业余爱好者。

ShowMaskAsOverlay不是MATLAB中的内置命令,但它非常有用。如果你想下载它访问这个link

另一种方式,我会建议从我的理解你的问题。您可以在制作正方形之前保存图像,并在制作正方形后保存另一张图像。那么你只需要弄清两张图片的区别。

close all;clear all;clc; 

% Read in Image 
im = imread('stack.png'); 

[r, c, ch] = size(im); 

% Convert Image to Gray if it's RGB 
if ch == 3 
    gray = rgb2gray(im); 
end 

% Threshold Value; > 0.87 = 1 and < 0.87 = 0 
thresh = 0.87; 
bw = im2bw(gray, thresh); 

% Removing unwanted white pixels 
bw = bwareaopen(bw, 400); 
bw = imerode(bw, strel('disk', 3)); 
bw = imfill(bw, 'holes'); 
bw = bwareaopen(bw, 600); 
bw = imdilate(bw, strel('disk', 3)); %optional. Could be omitted 

% Calculating the BoundingBox of the Square 
s = regionprops(bw, 'BoundingBox'); 
box = struct2cell(s); 
pos = cell2mat(box); 

%% Displaying Images 
figure(1) 
imshow(im) 
rectangle('position', pos, 'edgecolor', 'red', 'linewidth', 1.5) 
str = ['Bounding Box Bottom Right Corner Coordinate Value = ', num2str(pos(4))]; 
h = text(pos(3), pos(4), num2str(pos(4))); 
set(h, 'Color', 'k', 'FontSize', 12, 'FontWeight', 'bold') 
title(str) 

figure(2) 
imshow(gray) 
showMaskAsOverlay(0.5, bw, 'g') 

enter image description here

+0

喜乌萨马,感谢您的帮助!如果你不介意的话,我还有一些问题。 – NGCake

+0

我试图查看文档,但在这种情况下,我不清楚“图像侵蚀”究竟是什么。它只是试图让所有东西都变成磁盘形状吗? regionprops如何知道要测量哪些区域? 不应该将右下角的坐标设置为两个值,例如pos(3)和pos(4),或者您为什么只取pos(4)是否有原因?是否有可能根据这些坐标裁剪图像,例如右边是100x100平方100像素,右边是白色矩形右边100px?或者我需要先转换坐标? – NGCake

+0

@NGCake侵蚀是一种形态学操作,它可以去除分散的白色像素“1”。侵蚀是如何造成的?首先你指定一个结构元素'strel'。如果使用矩形或方形,我使用“磁盘”来避免尖锐的边缘。然后,'strel';又名核心或面具;以曲折的方式扫描图像。如果一个白色像素被N个黑色像素包围。然后,白色像素被删除。 – Tes3awy