這是我原來的圖像:「切出」基於圖像的邊緣檢測
我已經要求用戶裁剪,將其轉換爲灰度圖像,並運行在它下面這行代碼:
edgeImg = edge(grayImg,'canny',0.23);
這是結果:
我想「切出」一切中間的圓和外側邊緣,本質上。我真的很難搞清楚如何做到這一點,老實說我很茫然。
我認爲試圖填寫我想保留在二進制圖像中的區域,然後我可以將它用作郵票,但我無法想出一種不填充中間的方式圈也是如此。
任何想法?
謝謝。
編輯:這個白色區域是我想保留什麼:
這是我原來的圖像:「切出」基於圖像的邊緣檢測
我已經要求用戶裁剪,將其轉換爲灰度圖像,並運行在它下面這行代碼:
edgeImg = edge(grayImg,'canny',0.23);
這是結果:
我想「切出」一切中間的圓和外側邊緣,本質上。我真的很難搞清楚如何做到這一點,老實說我很茫然。
我認爲試圖填寫我想保留在二進制圖像中的區域,然後我可以將它用作郵票,但我無法想出一種不填充中間的方式圈也是如此。
任何想法?
謝謝。
編輯:這個白色區域是我想保留什麼:
我建議不要做邊緣檢測擺在首位,你正在失去與顏色相關的有價值的信息。您可以嘗試一些聚類算法,如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});
所得分割相當好:
答案應包括一些代碼來舉例 – krisdestruction
實際上我的回覆中提供了代碼:http://www.mathworks.com/help/images/examples/color-based-segmentation-using-k-means-clustering.html – Konstantin
@krisdestruction,你可以檢查結果。除裁剪圖像外,沒有任何手動工作 – Konstantin
代替使用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(...);
這是原始圖像。
裁剪圖像
開始閾值窗。
閾值參數
形成的遮掩
最終圖像
使用我的參數自動生成的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;
然後,您可以繼續使用imopen和imclose清理你的面具。然後將其應用於圖像。我的方法需要根據任何方法進行調整以使其完美,但它會爲您提供一致的結果。
要獲得圖像的補充,您需要做的就是反轉蒙版並應用它。
您的解決方案也相當不錯,但它需要一些手動工作。無論如何,我贊成它。 – Konstantin
Upvoted你的自動解決方案。雖然它需要一些手動輸入,但如果要按照問題中指定的OP創建最準確的戳記,通常需要此選項。我知道k-means和它可以做到的迷人之處,並且完全使用它,如果它是不同主題的獨特圖像。 – krisdestruction
試圖擴大形象和腐蝕它。這是一種非常常見的方法,請環顧一下 –
您可以突出顯示您實際想要保留的部分嗎?我不清楚這一點。謝謝 –
@ Benoit_11更新。 – TechnoSam