我有一個這樣的形象:MATLAB:去除小邊和簡化的組織學圖像
我想要做的是找到這種細胞在細胞外邊緣和內邊緣在不同顏色的兩部分之間。
但是這個圖像包含了很多細節我認爲,有沒有什麼辦法來簡化這個圖像,刪除那些小邊緣,找到我想要的邊緣?
我試過了matlab提供的邊緣函數。但它只能找到外邊緣,並受到那些細節邊緣的干擾。
我有一個這樣的形象:MATLAB:去除小邊和簡化的組織學圖像
我想要做的是找到這種細胞在細胞外邊緣和內邊緣在不同顏色的兩部分之間。
但是這個圖像包含了很多細節我認爲,有沒有什麼辦法來簡化這個圖像,刪除那些小邊緣,找到我想要的邊緣?
我試過了matlab提供的邊緣函數。但它只能找到外邊緣,並受到那些細節邊緣的干擾。
這是一個非常具有挑戰性的工作,由於模糊的邊界和紅色和綠色強度之間的微小差異。如果您想要非常精確地實施分割並滿足一些醫療需求,Shai的k-means加graph cuts可能是極少數選項之一(EM algorithm可能是替代選擇)。如果你有一個擁有許多相似圖像的大型數據庫,那麼一些machine learning methods可能會有所幫助。否則,我只寫了一個非常簡單的代碼來粗略地爲你提取內部紅色區域。邊界並不準確,因爲一些綠色區域也包括在內。
I1=I;
I=rgb2hsv(I);
I=I(:,:,1); % the channel with relatively large margin between green and red
I=I.*(I<0.25);
I=imdilate(I, true(5));
% I=imfill(I,'holes'); depends on what is your definition of the inner boundary
bw=bwconncomp(I);
ar=bw.PixelIdxList;
% find the largest labeled area,
n=0;
for i=1:length(ar)
if length(ar{i})>n
n=length(ar{i});
num=i;
end
end
bw1=bwlabel(I);
bwfinal(:,:,1)=(bw1==num).*double(I1(:,:,1));
bwfinal(:,:,2)=(bw1==num).*double(I1(:,:,2));
bwfinal(:,:,3)=(bw1==num).*double(I1(:,:,3));
bwfinal=uint8(bwfinal);
imshow(bwfinal)
在我看來,你的形象在三個主要顏色:
1.藍色上下的背景(但也存在內部的細胞爲「噪音」)細胞的
2. grenn上下的一個部分
3 。red-ish - 單元格的第二部分
如果這三種顏色足夠明顯,可以嘗試使用k-means和Graph切分來分割圖像。
第一階段 - 使用k-means將每個像素與三種主色之一相關聯。將k-means應用於圖像的顏色(每個像素是您選擇的顏色空間中的3維矢量)。用k=3
運行k-means,爲每個像素保留與質心距離。
第二階段 - 從背景中分離細胞。使用圖形切割進行二進制分割。每個像素的數據成本或者是到背景顏色的距離(如果像素被標記爲「背景」),或者是與其他兩種顏色(如果像素被標記爲「前景」)的最小距離。使用圖像對比度來設置平滑項的成對權重。
第三階段 - 分隔細胞的兩個部分。再次使用圖形切割進行二進制分割,但是這次僅對前一階段中標記爲「單元格」的像素起作用。對於所有標籤(這些是單元內的「噪點」像素),k-means分配給背景但被標記爲單元格的像素數據項應該爲零。
您可能會發現我的matlab wrapper for graph-cuts對此任務很有用。