簡體   English   中英

如何在MATLAB中識別並裁剪圖像內的矩形

[英]How to identify and crop a rectangle inside an image in MATLAB

我有一幅畫有矩形的圖像。 矩形可以是任何設計,但背景不是單一顏色。 這是從這樣的手機攝像頭拍攝的照片。 測試圖片 我想裁剪圖像中的內部圖片(場景)。

如何在MATLAB中執行此操作?

我嘗試了這段代碼

img = im2double(imread('https://i.stack.imgur.com/iS2Ht.jpg'));
BW = im2bw(img);
dim = size(BW)
col = round(dim(2)/2)-90;
row = min(find(BW(:,col)))
boundary = bwtraceboundary(BW,[row, col],'N');
r = [min(boundary) , max(boundary)];
img_cropped = img(r(1) : r(3) , r(2) : r(4) , :);
imshow(img_cropped);

但僅適用於一張圖片 在此處輸入圖片說明

而不是上面的那一項

在此處輸入圖片說明

我需要找到一個適用於具有特定矩形設計的任何圖像的代碼。感謝您的幫助。謝謝

以下處理考慮以下因素:

  • 背景為單色,可以漸變
  • 邊框是單色的(漸變的),很容易與背景區分開,而不是巴洛克風格
  • 圖片是具有許多細節的真實世界圖片,而不是Malevich的黑場

因此,我們首先通過熵過濾搜索圖片並展平背景

img=imread('http://i.stack.imgur.com/KMBRg.jpg');
%dimensions for neighbourhood are just a guess
cross_nhood = false(11,11); cross_nhood(:,6)=1;cross_nhood(6,:)=1;
img_ent = entropyfilt(img./255,repmat(cross_nhood,[1 1 3]));
img_ent_gray = rgb2gray(img_ent);

然后,我們使用哈里斯探測器找到拐角並選擇4個點:最左邊的兩個點和最右邊的兩個點,並對圖像進行裁剪,從而去除背景(精確度最高為傾斜)。 我使用r2011a,您可能有一些不同的功能 ,請參考MATLAB幫助

harris_pts = corner(img_ent_gray);
corn_pts = sortrows(harris_pts,1); 
corn_pts = [corn_pts(1:2,:);...
            corn_pts(size(corn_pts,1)-1:size(corn_pts,1),:)];
crop_img=img(min(corn_pts(:,2)):max(corn_pts(:,2)),...
             min(corn_pts(:,1)):max(corn_pts(:,1)),:);
corn_pts(:,1)=corn_pts(:,1) - min(corn_pts(:,1));
corn_pts(:,2)=corn_pts(:,2) - min(corn_pts(:,2));
corn_pts = corn_pts + 1;

這是一個問題:拐角點之間的線傾斜了一些不同的角度。 這既可能是拐角檢測和圖像捕獲(客觀失真和/或采集角度有點錯誤)的問題。 沒有簡單,永遠正確的解決方案。 我最好選擇最大的傾斜度(它將略微裁切圖片)並開始逐行處理圖像(使用Bresenham算法分割圖像),直到您選擇的任何或大多數像素都屬於圖像,而不是像素為止。內邊界。 可區分的特征可以是局部熵,顏色值的標准,特定的顏色閾值,不同的統計方法等等。

另一種方法是進行顏色分割,我喜歡大多數Gram-Shmidt正交化或a * -b *顏色分割 但是,如果圖像歪斜並且圖片的一部分與邊框的顏色匹配(同樣,請參見最后一張圖片,左下角),也會遇到同樣的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM