2014-05-07 12 views
10

Einer meiner Freunde arbeitete an folgendem Projekt:Finden von Gruben in einem Bild

Unten ist das mikroskopische (SEM) Bild der Oberfläche des Edelstahls.

enter image description here

Aber man kann sehen, ist es ein wenig (nach langer Exposition gegenüber Meeresumwelt) und einige Vertiefungen auf der Oberfläche gebildet korrodiert. Einige der Gruben sind im roten Kreis markiert.

Er muss die Anzahl der Gruben im Bild finden und er hat es manuell gezählt (stell dir vor, es gibt fast 150 Bilder). Also dachte ich daran, diesen Prozess mit jedem Bildbearbeitungsprogramm zu automatisieren.

Frage:

Wie kann ich die Anzahl der Gruben in diesem Bild finden?


Was ich versucht:

Als ersten Schritt verbessert ich den Kontrast ein wenig durch Schließvorgang.

import numpy as np 
import cv2 
from matplotlib import pyplot as plt 

img = cv2.imread('6.jpg') 
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(11,11)) 

close = cv2.morphologyEx(gray, cv2.MORPH_CLOSE, kernel) 

close2 = cv2.add(close,1) 
div = (np.float32(gray)+1)/(close2) 
div2 = cv2.normalize(div,None, 0,255, cv2.NORM_MINMAX) 
div3 = np.uint8(div2) 

Ergebnis:

enter image description here

Dann habe ich für einen bestimmten Schwellenwert für 127 und Konturen darin finden. Später werden diese Konturen basierend auf ihrer Fläche gefiltert (es gibt keine spezifische Information über die Fläche, ich habe einen Bereich von 1-10 als einen empirischen Wert genommen).

ret, thresh = cv2.threshold(div3, 127,255, cv2.THRESH_BINARY_INV) 
temp, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE) 

res = np.zeros(gray.shape,np.uint8) 

for cnt in contours: 
    if 1.0 < cv2.contourArea(cnt) < 10.0: 
     res = cv2.drawContours(res, [cnt], 0, 255, -1) 

plt.subplot(121); plt.imshow(img, 'gray'); plt.subplot(122); plt.imshow(res,'gray'); plt.show() 

Aber es endete in viel extra Lärm. Das Ergebnis sehen Sie unten:

enter image description here


Weitere Informationen:

Einige Testbilder:

enter image description here enter image description here

+1

Eine andere Möglichkeit, Ihren Vorverarbeitungsschritt durchzuführen, wäre dies: http://scikit-image.org/docs/dev/auto_examples/plot_holes_and_peaks.html –

Antwort

6

Ihr Fall erinnert mich an ein Papier (Human Detection Using a Mobile Platform and Novel Features Derived From a Visual Saliency Mechanism), die die Salienz in einem Bild berechnet, das auf dem Begriff der Ganglienzelle in der Mitte basiert, d. H. Eine Methode, die helle, von dunklen Bereichen umgebene Pixel (oder die entgegengesetzt als außerhalb der Zellen bezeichneten Zellen) erkennt.

Ganglion cells

Um diese Zellen zu nähern Sie rechteckige Flächen verwenden können. Durch die Verwendung von integrierten Bildern können Sie den Vorgang beschleunigen. Überprüfen Sie das Papier für Details.

Eine weitere Idee wäre die Faltung eines zusammengesetzten Filters gewesen. Suchen Sie eine Vorlage, die sich sehr nahe an jeder Vertiefung befindet, und korrelieren Sie die Vorlage mit dem Bild (oder verwenden Sie mehrere Filter für die Skalierung/Formularvariation).

+0

"helle Pixel von dunklen Bereichen umgeben", das ist der Punkt! – Yvon

Verwandte Themen