2014-10-10 69 views
0

我的問題是,如何改善此代碼以移除圖像中的視盤?

  1. 此代碼需要太長時間才能加載;
  2. 某些其他圖像的視盤不起作用。

原始圖像顯示在代碼下面。

raw = imread('DDB (1).jpg') 
%%% ===============OPTIC DISC DETECTION================== 
adjusted1=imadjust(raw,[0.9 0.8 0; 1 0.9 0.3],[0.1 0.5]); %adjust color to violet for  more defined edges 
rgb=adjusted1; 
szeimg=size(rgb); 
width=szeimg(:,1)/2; 
k=ones(szeimg(1),szeimg(2)); 
whiteBG=double(k); 
[centersBright, radiiBright, metricBright] = imfindcircles(rgb,[fix(width*0.1) fix(width*0.4)],'ObjectPolarity','bright','Sensitivity',0.92,'EdgeThreshold',0.12); 
if isempty(radiiBright)==1; 
    [centersBright, radiiBright, metricBright] = imfindcircles(rgb,[fix(width*0.1) fix(width*0.4)],'ObjectPolarity','bright','Sensitivity',0.92,'EdgeThreshold',0.06); 
    if isempty(radiiBright)==1; 
     ODdetect=whiteBG; 
    else 
     ODdetect=insertShape(whiteBG,'FilledCircle',[centersBright(:,1), centersBright(:,2),radiiBright.*1.2],'Color','black','Opacity',1); 
    end 
else 
ODdetect=insertShape(whiteBG,'FilledCircle',[centersBright(:,1), centersBright(:,2),radiiBright.*1.2],'Color','black','Opacity',1); 
end 

Orig Image

+1

對於定時,與分析器檢查以查看哪個部分正在最長(可能'imfindcircles')。另一方面,您必須指定「不起作用」,但最有可能的情況是,您爲此圖像硬編碼的設置('EdgeThreshold'等)不適用於所有圖像。 – nkjt 2014-10-10 12:21:10

+0

什麼是「其他」圖像? – kkuilla 2014-10-10 12:47:17

+0

圖像具有不同光強度的視盤。由於該代碼僅基於用於視盤 – Jamesmeister 2014-10-10 13:03:44

回答

0

我想可能是有幫助做一些更多的預處理,分離出視盤區域。在下面的代碼中,我使用了形態濾波(關閉刪除更精細的細節,強調邊緣的漸變)和閾值來實現。此處使用的結構元素大小和閾值適用於我從Google圖片搜索中找到的其他大小相似的圖片。您可能想要調整這些參數。希望這給出一些指針。

close all; 
clear all; 

im = imread('2.jpg'); 
cl = imclose(im, ones(7)); 

er = imerode(cl, ones(3)); 
di = imdilate(cl, ones(3)); 
grad3 = di - er; 
grad = double(grad3(:, :, 1)) + double(grad3(:, :, 2)) + double(grad3(:, :, 3)); 
bw = grad > graythresh(grad)*255*.2; 
bwcl = imclose(bw, ones(5)); 

figure, 
subplot(2, 2, 1), imshow(im), title('original') 
subplot(2, 2, 2), imshow(cl), title('closed') 
subplot(2, 2, 3), imshow(bw, []), title('edges') 
subplot(2, 2, 4), imshow(bwcl, []), title('closed edges') 

的一些結果:

enter image description hereenter image description here

編輯

我想我碰到要通過一些文獻(link而一個簡單的方法 - 只聚類部件,再次使用kmeans而不是提出的FCM,並調整樣本集的聚類數量)。以下是代碼和一些結果。我不是在提議這個問題作爲對問題的回答,而只是表明它是可行的。

close all; 
clear all; 

im = imread('1.jpg'); 
cl = imclose(im, ones(7)); 

red = im(:, :, 1); 
med = medfilt2(red, [15 15]); 
havg = fspecial('average', [15 15]); 
avg = imfilter(cl, havg); 

r = double(avg(:, :, 1)); 
g = double(avg(:, :, 2)); 
b = double(avg(:, :, 3)); 

x = [double(med(:)) r(:) g(:) b(:)]; 
idx = kmeans(x, 6); 
clust = reshape(idx, size(med)); 

一些結果:

enter image description here

+0

的顏色(紫色),因此不幸的是,先生有一些圖像,其中視盤在圖像中不是那麼明顯。因此,邊緣檢測很難使用。我會先嚐試對比度增強,看圖片是否可能。但是,謝謝你的幫助。 – Jamesmeister 2014-10-18 09:09:42

+0

不適用於所有圖像。 :( – Jamesmeister 2014-10-18 09:39:11

+0

)那些像結構的靜脈似乎來源於視盤區域,如果能夠分割出這些結構並像測量那樣得到它們的空間密度,那麼您可以將這些知識與其他結合起來,並得出更好的解決方案。說,如果你只是搜索'分割視盤',你會發現很多文獻,他們肯定會有更好的解決方案。 – dhanushka 2014-10-19 02:32:48