Das Folgende funktioniert für Ihr angegebenes Beispiel, obwohl es möglicherweise für eine größere Anzahl von Bildern optimiert werden muss.
import numpy as np
import cv2
image_src = cv2.imread("input.png")
gray = cv2.cvtColor(image_src, cv2.COLOR_BGR2GRAY)
ret, gray = cv2.threshold(gray, 250,255,0)
image, contours, hierarchy = cv2.findContours(gray, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
largest_area = sorted(contours, key=cv2.contourArea)[-1]
mask = np.zeros(image_src.shape, np.uint8)
cv2.drawContours(mask, [largest_area], 0, (255,255,255,255), -1)
dst = cv2.bitwise_and(image_src, mask)
mask = 255 - mask
roi = cv2.add(dst, mask)
roi_gray = cv2.cvtColor(roi, cv2.COLOR_BGR2GRAY)
ret, gray = cv2.threshold(roi_gray, 250,255,0)
image, contours, hierarchy = cv2.findContours(gray, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
max_x = 0
max_y = 0
min_x = image_src.shape[1]
min_y = image_src.shape[0]
for c in contours:
if 150 < cv2.contourArea(c) < 100000:
x, y, w, h = cv2.boundingRect(c)
min_x = min(x, min_x)
min_y = min(y, min_y)
max_x = max(x+w, max_x)
max_y = max(y+h, max_y)
roi = roi[min_y:max_y, min_x:max_x]
cv2.imwrite("roi.png", roi)
Geben Sie die folgende Art der Ausgangsbilder:
Und ...
Der Code funktioniert, indem zuerst die größte Konturbereich zu lokalisieren. Daraus wird eine Maske erzeugt, die verwendet wird, um zuerst nur den Bereich innerhalb, d. H. Den Text, auszuwählen. Die Umkehrung der Maske wird dann zu dem Bild hinzugefügt, um den Bereich außerhalb der Maske in Weiß umzuwandeln.
Endlich Konturen sind wieder für dieses neue Bild gefunden. Alle Konturbereiche außerhalb eines geeigneten Größenbereichs werden verworfen (dies wird verwendet, um kleine Rauschbereiche zu ignorieren), und für jeden wird ein begrenzendes Rechteck gefunden. Mit jedem dieser Rechtecke wird für alle verbleibenden Konturen ein begrenzender Rect outer
berechnet, und unter Verwendung dieser Werte wird ein Ausschnitt erstellt, um das endgültige Bild zu erhalten.
aktualisieren - Um den Rest des Bildes zu erhalten, das heißt mit dem obigen Bereich entfernt wird, werden die folgenden könnten verwendet:
image_src = cv2.imread("input.png")
gray = cv2.cvtColor(image_src, cv2.COLOR_BGR2GRAY)
ret, gray = cv2.threshold(gray, 10, 255,0)
image, contours, hierarchy = cv2.findContours(gray, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
largest_area = sorted(contours, key=cv2.contourArea)[-1]
mask = np.zeros(image_src.shape, np.uint8)
cv2.drawContours(mask, [largest_area], 0, (255,255,255,255), -1)
image_remainder = cv2.bitwise_and(image_src, 255 - mask)
cv2.imwrite("remainder.png", image_remainder)
an die Wähler, die Frage ist zu breit. Bitte lassen Sie mich wissen, wie Sie es weiter eingrenzen können. Ich glaube nicht, dass die Frage breit ist. – Anthony
Sie müssen eine adaptive Schwellenwertbildung durchführen und Operationen öffnen und schließen. http://docs.opencv.org/doc/tutorials/imgproc/opening_closing_hats/opening_closing_hats.html Sie könnten auch benutzerdefinierte Erosion oder Dilatation tun (die basicall ist, welche öffnen und schließen Operationen tun). –
Ist dies das Eingabebild? Oder ergeben sich aus einer Art Schwellwert? – ZdaR