Erd*_*zgi 8 matlab image-processing computational-geometry
我正在制作一个图像处理项目,而且我已经陷入了项目的一个步骤.这是情况;
这是我的面具:
我想要检测可以适合这个蒙版的最大尺寸矩形.
我正在为我的项目使用MATLAB.你知道实现这个目标的任何快速方法吗?任何代码示例,方法或技术都会很棒.
编辑1:以下两种算法适用于大量案例.但是在一些困难的情况下,他们都给出了错误的结果.我在我的项目中使用了它们.
这种方法从整个图像开始,逐个像素地收缩每个边框,直到找到可接受的矩形.
在示例图像上运行大约需要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)
另一个示例图片: