0
我想知道如何检测手工制作的纸张正方形的右下角(这可能不是完全正方形的,因为我自己绘制了它)在另一个物体的顶部。我想要做的就是使用这个方块作为参考,并根据方块的右下角对齐图像。我是一个Matlab业余爱好者。任何人都可以帮忙吗?如何检测部分矩形并使用Matlab对齐图像?
左上角的正方形是纸张正方形,我需要检测哪个是参考点。
我想知道如何检测手工制作的纸张正方形的右下角(这可能不是完全正方形的,因为我自己绘制了它)在另一个物体的顶部。我想要做的就是使用这个方块作为参考,并根据方块的右下角对齐图像。我是一个Matlab业余爱好者。任何人都可以帮忙吗?如何检测部分矩形并使用Matlab对齐图像?
左上角的正方形是纸张正方形,我需要检测哪个是参考点。
你有很多的选择,检测方;它实际上是一个矩形;你想检测,但最简单的方法是使用形态学操作。在这里我提供了一个评论脚本来帮助你;因为你是一个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')
喜乌萨马,感谢您的帮助!如果你不介意的话,我还有一些问题。 – NGCake
我试图查看文档,但在这种情况下,我不清楚“图像侵蚀”究竟是什么。它只是试图让所有东西都变成磁盘形状吗? regionprops如何知道要测量哪些区域? 不应该将右下角的坐标设置为两个值,例如pos(3)和pos(4),或者您为什么只取pos(4)是否有原因?是否有可能根据这些坐标裁剪图像,例如右边是100x100平方100像素,右边是白色矩形右边100px?或者我需要先转换坐标? – NGCake
@NGCake侵蚀是一种形态学操作,它可以去除分散的白色像素“1”。侵蚀是如何造成的?首先你指定一个结构元素'strel'。如果使用矩形或方形,我使用“磁盘”来避免尖锐的边缘。然后,'strel';又名核心或面具;以曲折的方式扫描图像。如果一个白色像素被N个黑色像素包围。然后,白色像素被删除。 – Tes3awy