image - Matlab:二进制图像打开到最小矩形大小

标签 image matlab binary

我有一个二进制图像:

enter image description here

我正在尝试查看 100x150 的矩形是否适合 map 上的任何空白区域。 我尝试创建一个矩形 strel,然后腐 eclipse 和扩大图片以去除任何小于所需的区域:

se = strel('rectangle',[150, 100]);
BW = imerode(BW,se);
BW = imdilate(BW,se);

不幸的是,它过早地找到了一个洞

enter image description here

只有 80x150。我认为侵 eclipse 失败了,因为它靠在墙上并且只需要一半的宽度,但不知道如何修复它。

此外,如果我走错了路,请随时纠正我。最终,我只需要找到至少100x150那么大的空白区域的左上角。

最佳答案

下面的方法工作得很好并且运行得相当快。它有一些嵌套循环,但您可以进一步优化性能,我主要只是想让它为您工作。请记住,如果您注释掉 fprintf() 和绘图命令,那将加快速度。

我从您的 Stack 帖子下载了您的图片,但我相信我下载的版本与您正在使用的原始数据的大小 (398x398) 不同,因此在查看下面的结果时请记住这一点。

如代码中所示,您提供宽度 (w) 和高度 (h),然后算法会返回矩形适合的所有(列、行)位置。

旁注: 我相信这为 Bin packing problem 的二维版本提供了解决方案,但我不确定,如果您对此感兴趣,可以查看上面的链接。

无论哪种方式,它都是计算问题的一个很好的例子,可以相当快地执行穷举搜索。

为了验证结果,我添加了矩形的简单绘图。请记住,如果矩形适合多个位置,则多个矩形的绘图开始看起来相当困惑,因为它们在彼此之上重复绘制(有偏移)。

作为仅找到一个矩形的示例,我使用:w = 29; h = 102; 然后结果显示这个特定矩形唯一适合的位置是左上角 = (row = 295, col = 368)(这个矩形大小可能只适用于我下载的您的数据版本):

enter image description here

总而言之,我首先加载数据,然后转换为二进制映射(0 和 1):

% Note: '0' = black; '1' = white
data = round(im2double(rgb2gray(imread(filepath))));
figure(1);imshow(data); set(gcf,'Color',[1 1 1]);
hold on;

输入搜索宽度和高度:

w = 29;
h = 102;

sze = size(data);
numRows = sze(1);
numCols = sze(2);

接下来我们只是进行搜索以查看适合每行和每列位置的内容:

for col = 1:numCols - w - 1
    for row = 1:numRows - h - 1
        doesFit = fitshere(data, row,col, w, h);
        if (doesFit == 1)
            fprintf('row = %d; col = %d \n',row,col);
            colX = [col col+w col+w col col];
            colY = [row row row+h row+h row];
            line(colX,colY,'Color','r','linewidth',2);
        end
    end
end

hold off;

您将需要以下函数来检查给定的矩形是否适合数组:

function [val] = fitshere(data, row, col, w, h)
val = 1;
for i = col:col + w
    for j = row:row + h
        if (data(j,i) == 0) % if this is true, we are in the black!
            val = 0;
            return;
        end
    end
end
return;

如果您想知道您的矩形是否完全适合(比如 width X heightheight X width),您可以在交换宽度和高度。

希望这对您有所帮助。

关于image - Matlab:二进制图像打开到最小矩形大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20892372/

相关文章:

image - MATLAB:以原始大小显示图像

c++ - C++ 中缓慢的 Matlab R2018b TypedArray 数组访问

java - 使用 Java 从 C 语言编写的文件中读取

c# - 从 C# win 中的 char 获取 8 位二进制数。形式

ios - 在ios中将多个图像粘贴到圆柱体表面并滚动

matlab - 我想在 matlab 的矩阵中找到一个数字的位置

java - 有没有办法使用 Apache POI 将大图像添加到 xls 文件中?

c++ - 条件下移位操作的使用说明

html - 如何使用css3制作弹出图像?

java - 将 DICOM 转换为 JPEG 时出错