如何检测可以在蒙版上绘制的最大尺寸矩形?

Erd*_*zgi 8 matlab image-processing computational-geometry

我正在制作一个图像处理项目,而且我已经陷入了项目的一个步骤.这是情况;

这是我的面具:

在此输入图像描述

我想要检测可以适合这个蒙版的最大尺寸矩形.

在此输入图像描述

我正在为我的项目使用MATLAB.你知道实现这个目标的任何快速方法吗?任何代码示例,方法或技术都会很棒.

编辑1:以下两种算法适用于大量案例.但是在一些困难的情况下,他们都给出了错误的结果.我在我的项目中使用了它们.

eig*_*ris 8

这种方法从整个图像开始,逐个像素地收缩每个边框,直到找到可接受的矩形.

在示例图像上运行大约需要0.02秒,因此速度相当快.

编辑:我应该澄清,这并不是一个通用的解决方案.该算法依赖于矩形居中并且具有与图像本身大致相同的纵横比.但是,在适当的情况下,它很快.@DanielHsH提供了一个解决方案,他们声称在所有情况下均可使用.


代码:

clear; clc;
tic;
%% // read image
imrgb= imread('box.png');
im = im2bw(rgb2gray(imrgb));    %// binarize image
im = 1-im;                      %// convert "empty" regions to 0 intensity
[rows,cols] = size(im);

%% // set up initial parameters
ULrow = 1;       %// upper-left row        (param #1)
ULcol = 1;       %// upper-left column     (param #2)
BRrow = rows;    %// bottom-right row      (param #3)
BRcol = cols;    %// bottom-right column   (param #4)

parameters = 1:4;   %// parameters left to be updated
pidx = 0;           %// index of parameter currently being updated

%% // shrink region until acceptable
while ~isempty(parameters); %// update until all parameters reach bounds

    %// 1. update parameter number
    pidx = pidx+1;
    pidx = mod( pidx-1, length(parameters) ) + 1;
    p = parameters(pidx);   %// current parameter number

    %// 2. update current parameter
    if p==1; ULrow = ULrow+1; end;
    if p==2; ULcol = ULcol+1; end;
    if p==3; BRrow = BRrow-1; end;
    if p==4; BRcol = BRcol-1; end;

    %// 3. grab newest part of region (row or column)
    if p==1; region = im(ULrow,ULcol:BRcol); end;
    if p==2; region = im(ULrow:BRrow,ULcol); end;
    if p==3; region = im(BRrow,ULcol:BRcol); end;
    if p==4; region = im(ULrow:BRrow,BRcol); end;

    %// 4. if the new region has only zeros, stop shrinking the current parameter
    if isempty(find(region,1))
        parameters(pidx) = [];
    end

end

toc;
params = [ULrow ULcol BRrow BRcol]
area = (BRrow-ULrow)*(BRcol-ULcol) 
Run Code Online (Sandbox Code Playgroud)

此图片的结果:

Elapsed time is 0.027032 seconds.

params =

    10    25   457   471


area =

      199362
Run Code Online (Sandbox Code Playgroud)

用于可视化结果的代码:

imrgb(params(1):params(3),params(2):params(4),1) = 0;
imrgb(params(1):params(3),params(2):params(4),2) = 255;
imrgb(params(1):params(3),params(2):params(4),3) = 255;
imshow(imrgb);
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

另一个示例图片:

在此输入图像描述

  • 这个算法是错误的。它可能不会产生正确的结果 (2认同)