2016-04-19 13 views
13

मैं निम्नलिखित परिणाम प्राप्त करने के लिए CLAHE हिस्टोग्राम लागू करने, एक छवि से रक्त वाहिकाओं को निकालने के लिए कोशिश कर रहा हूँ, और ऐसा करने के लिए मैं पहली छवि बराबर रहा हूँ,:रक्त वाहिकाओं के साथ छवि प्रसंस्करण मुद्दों

 clahe = cv2.createCLAHE(clipLimit=100.0, tileGridSize=(100,100)) 
     self.cl1 = clahe.apply(self.result_array) 
     self.cl1 = 255 - self.cl1 

enter image description here

और फिर मैं Otsu सीमा का उपयोग कर रहा रक्त वाहिकाओं को निकालने के लिए, लेकिन यह अच्छी तरह से करने में नाकाम रहने के:

self.ret, self.thresh = cv2.threshold(self.cl1, 0,255,cv2.THRESH_BINARY + cv2.THRESH_OTSU) 
     kernel = np.ones((1,1),np.float32)/1 
     self.thresh = cv2.erode(self.thresh, kernel, iterations=3) 
     self.thresh = cv2.dilate(self.thresh, kernel, iterations=3) 

यहाँ परिणाम है:

enter image description here

जाहिर है शोर के एक बहुत कुछ है। मैंने मेडियन ब्लर का उपयोग करने की कोशिश की है, लेकिन यह सिर्फ कुछ शोर में शोर को क्लस्टर करता है और इसे ब्लॉब में बनाता है। रक्त वाहिकाओं को पाने के लिए शोर को हटाने के बारे में मैं कैसे जा सकता हूं?

यह मूल छवि से दूर मैं रक्त वाहिकाओं को निकालने के लिए कोशिश कर रहा हूँ है:

enter image description here

+0

कृपया एक मूल छवि और अपेक्षित आउटपुट संलग्न करें। – ZdaR

+0

मेरे पास वांछित आउटपुट नहीं है, क्षमा करें। मैंने मूल संलग्न किया है। –

+0

क्या आप tileGridSize = (8,8) को कुछ और (20,20) की तरह सेट करने का प्रयास करेंगे? मेरा मानना ​​है कि eqqlizing थोड़ा आक्रामक है। यह पूरी तरह से समस्या का समाधान नहीं करेगा, लेकिन बेहतर परिणाम हो सकता है। – Art

उत्तर

11

वास्तव में अच्छा परिणाम प्राप्त करना एक कठिन समस्या है (मैं अपने पिछले छवि के साथ काम किया) (आप शायद किसी भी तरह संरचना मॉडल करने के लिए होगा रक्त वाहिकाओं और शोर के) लेकिन आप अभी भी फ़िल्टरिंग से बेहतर कर सकते हैं।

समस्याओं के इस प्रकार, कैनी बढ़त डिटेक्टर से प्रेरित को संबोधित कर रहे दो थ्रेसहोल्ड उपयोग कर रहा है के लिए एक तकनीक - [hi,low] और अगर r > hi एक रक्त वाहिका V से संबंधित के रूप प्रतिक्रिया r के साथ एक पिक्सेल p वर्गीकृत करने || (r > lo & & p में से एक पड़ोसी V में है)।

इसके अलावा, जब फ़िल्टरिंग की बात आती है, तो दोनों द्विपक्षीय फ़िल्टरिंग और साधन फ़िल्टर फ़िल्टरिंग शोर छवियों के लिए अच्छे होते हैं।

kernel3 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(3,3)) 
kernel5 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5)) 
kernel7 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(7,7)) 
t_lo = 136 
t_hi = 224 

blured = cv2.pyrMeanShiftFiltering(img, 3, 9) 
#blured = cv2.bilateralFilter(img, 9, 32, 72) 

clahe = cv2.createCLAHE(clipLimit=128.0, tileGridSize=(64, 64)) 
cl1 = clahe.apply(blured) 
cl1 = 255 - cl1 

ret, thresh_hi = cv2.threshold(cl1, t_hi, 255, cv2.THRESH_TOZERO) 
ret, thresh_lo = cv2.threshold(cl1, t_lo, 255, cv2.THRESH_TOZERO) 

low threshold कम सीमा छवि hi threshold हाय सीमा छवि

तैयारी और सफाई:

current = np.copy(thresh_hi) 
prev = np.copy(current) 
prev[:] = 0 
current = cv2.morphologyEx(current, cv2.MORPH_OPEN, kernel5) 
iter_num = 0 
max_iter = 1000 

नहीं लिए सबसे कारगर तरीका है कि ऐसा करने के लिए ...लेकिन लागू करने में आसान:

while np.sum(current - prev) > 0 and iter_num < max_iter: 
    iter_num = iter_num+1 
    prev = np.copy(current) 
    current = cv2.dilate(current, kernel3) 
    current[np.where(thresh_lo == 0)] = 0 

initial mask प्रारंभिक मुखौटा

छोटे धब्बे निकालें:

:

contours, hierarchy = cv2.findContours(current, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE) 
for contour in contours: 
    area = cv2.contourArea(contour) 
    if area < 256: 
     cv2.drawContours(current, [contour], 0, [0,0,0], -1) 

refined mask छोटे धब्बे

रूपात्मक सफाई को हटाने के बाद

opening = cv2.morphologyEx(current, cv2.MORPH_OPEN, kernel7) 
cl1[np.where(opening == 0)] = 0 

result परिणाम

यह कोई इष्टतम तरह से है, लेकिन मुझे लगता है कि यह काफी उपकरणों शुरू करने के लिए के साथ आप प्रदान करना चाहिए।

6

कैसे के बारे में: उच्च दर्रा (छवि शून्य से सिग्मा 12 के साथ गाऊसी चिकनी), तो सीमा (126) और फिर छोटे-ऑब्जेक्ट्स दमन (ऑब्जेक्ट जो 300 पिक्सेल से छोटे हैं) हटा दिए जाते हैं?

enter image description here

enter image description here

enter image description here

संबंधित मुद्दे