2015-04-23 68 views
5

這是我原來的圖像:Weld Nut「切出」基於圖像的邊緣檢測

我已經要求用戶裁剪,將其轉換爲灰度圖像,並運行在它下面這行代碼:

edgeImg = edge(grayImg,'canny',0.23); 

這是結果:

Edges

我想「切出」一切中間的圓和外側邊緣,本質上。我真的很難搞清楚如何做到這一點,老實說我很茫然。

我認爲試圖填寫我想保留在二進制圖像中的區域,然後我可以將它用作郵票,但我無法想出一種不填充中間的方式圈也是如此。

任何想法?

謝謝。

編輯:這個白色區域是我想保留什麼:

Highlighted

+0

試圖擴大形象和腐蝕它。這是一種非常常見的方法,請環顧一下 –

+1

您可以突出顯示您實際想要保留的部分嗎?我不清楚這一點。謝謝 –

+1

@ Benoit_11更新。 – TechnoSam

回答

2

我建議不要做邊緣檢測擺在首位,你正在失去與顏色相關的有價值的信息。您可以嘗試一些聚類算法,如K-Means (including source code)或其他任何其他。

聚類完成後,您可以使用該對象保留與羣集相關的像素。可以基於圖像中的對象位置(包括圖像的裁剪)及其顏色來選擇期望的聚類。

K均值聚類爲2簇的代碼例子如下:

he = imread('D:\1.jpg'); 
imshow(he); 

cform = makecform('srgb2lab'); 
lab_he = applycform(he,cform); 

ab = double(lab_he(:,:,2:3)); 
nrows = size(ab,1); 
ncols = size(ab,2); 
ab = reshape(ab,nrows*ncols,2); 

%One cluster for your object and one for background 
nColors = 2; 
[cluster_idx, cluster_center] = kmeans(ab,nColors,'distance','sqEuclidean', ... 
             'Replicates',2); 


pixel_labels = reshape(cluster_idx,nrows,ncols); 

segmented_images = cell(1,3); 
rgb_label = repmat(pixel_labels,[1 1 3]); 

for k = 1:nColors 
    color = he; 
    color(rgb_label ~= k) = 0; 
    segmented_images{k} = color; 
end 

%Show both clusters: object and non-object 
imshow(segmented_images{1}); 
figure; 
imshow(segmented_images{2}); 

所得分割相當好:

enter image description hereenter image description here

+0

答案應包括一些代碼來舉例 – krisdestruction

+1

實際上我的回覆中提供了代碼:http://www.mathworks.com/help/images/examples/color-based-segmentation-using-k-means-clustering.html – Konstantin

+0

@krisdestruction,你可以檢查結果。除裁剪圖像外,沒有任何手動工作 – Konstantin

1

代替使用K-意思是,你可以簡單地使用color thresholder,因爲你有這麼多的顏色信息。然後您可以調用自動生成的名爲createMask的蒙版功能,並進一步後處理您的圖像。代碼如下。 最好的這種方法的一部分是,createMask是可重複使用的任何圖像,不只是你自己的!

% Read Image 
I = imread('r8ATB.jpg'); 
figure; imshow(I); 

% Crop Image 
C = I(75:490,40:460,:); 
figure; imshow(C); 

% Plot Noisy Mask 
[BW,MK] = createMask(C); 
figure; imshow(BW); 
figure; imshow(BW); 

% Fix Holes 
imopen(...); 

這是原始圖像。

Original Image

裁剪圖像

enter image description here

開始閾值窗。

enter image description here

閾值參數

enter image description here

形成的遮掩

enter image description here

最終圖像

enter image description here

使用我的參數自動生成的createMask.m函數如下。

function [BW,maskedRGBImage] = createMask(RGB) 
%createMask Threshold RGB image using auto-generated code from colorThresholder app. 
% [BW,MASKEDRGBIMAGE] = createMask(RGB) thresholds image RGB using 
% auto-generated code from the colorThresholder App. The colorspace and 
% minimum/maximum values for each channel of the colorspace were set in the 
% App and result in a binary mask BW and a composite image maskedRGBImage, 
% which shows the original RGB image values under the mask BW. 

% Auto-generated by colorThresholder app on 23-Apr-2015 
%------------------------------------------------------ 


% Convert RGB image to chosen color space 
I = rgb2hsv(RGB); 

% Define thresholds for channel 1 based on histogram settings 
channel1Min = 0.983; 
channel1Max = 0.167; 

% Define thresholds for channel 2 based on histogram settings 
channel2Min = 0.205; 
channel2Max = 1.000; 

% Define thresholds for channel 3 based on histogram settings 
channel3Min = 0.341; 
channel3Max = 1.000; 

% Create mask based on chosen histogram thresholds 
BW = ((I(:,:,1) >= channel1Min) | (I(:,:,1) <= channel1Max)) & ... 
    (I(:,:,2) >= channel2Min) & (I(:,:,2) <= channel2Max) & ... 
    (I(:,:,3) >= channel3Min) & (I(:,:,3) <= channel3Max); 

% Invert mask 
BW = ~BW; 

% Initialize output masked image based on input image. 
maskedRGBImage = RGB; 

% Set background pixels where BW is false to zero. 
maskedRGBImage(repmat(~BW,[1 1 3])) = 0; 

然後,您可以繼續使用imopenimclose清理你的面具。然後將其應用於圖像。我的方法需要根據任何方法進行調整以使其完美,但它會爲您提供一致的結果。

要獲得圖像的補充,您需要做的就是反轉蒙版並應用它。

+1

您的解決方案也相當不錯,但它需要一些手動工作。無論如何,我贊成它。 – Konstantin

+1

Upvoted你的自動解決方案。雖然它需要一些手動輸入,但如果要按照問題中指定的OP創建最準確的戳記,通常需要此選項。我知道k-means和它可以做到的迷人之處,並且完全使用它,如果它是不同主題的獨特圖像。 – krisdestruction