Eine Reihe von Studien zur grundlegenden Bildverarbeitung von Grund auf neu (4).
Weitere Informationen finden Sie im OpenCV-Python-Tutorial Bilderkennungsbuch https://www.amazon.co.jp/dp/4061529129/ Es ist eine Politik, das Verständnis für die Verarbeitung zu fördern, in der gearbeitet wird.
Python 3.7.0 OpenCV 4.1.0 Jupyter Notebook
Führen Sie eine Konturextraktion für das binärisierte Panda-Bild durch. Die Rückgabewertkonturen von findContours sind die Koordinatensätze für jede Kontur, und die Hierarchie ist die hierarchische Struktur der Kontur. Diesmal besteht der Umriss aus zwei Ebenen. Der Umriss wurde auf dem ursprünglichen Panda-Bild gezeichnet.
rinkaku.py
import cv2
import numpy as np
from matplotlib import pyplot as plt
from pylab import rcParams #Ändern Sie die Größe der Bildanzeige
%matplotlib inline
rcParams['figure.figsize'] = 25, 20 #Bildanzeigegröße
img = cv2.imread('/brabra/6.jpg',0)
#Halten Sie das Bild komprimiert
img = cv2.resize(img, dsize=None, fx=0.15, fy=0.15)
#Binarisierung(Der Schwellenwert stammt aus der Binärisierung von Otsu)
ret,thresh = cv2.threshold(img,59,255,0)
#Umkehren
thresh= cv2.bitwise_not(thresh)
#Konturextraktion(RETR_CCOMP besteht aus zwei Schichten)
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE)
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB) #In RGB-Format konvertieren
#Zeichnen Sie den gefundenen Umriss auf das Originalbild
for i in range(len(contours)):
#Zeichne die oberste Ebene (grün)
if hierarchy[0][i][3] == -1:
cv2.drawContours(img, contours, i, (0, 255, 0), 2)
#Zeichne die zweite Ebene (hellblau)
else:
cv2.drawContours(img, contours, i, (0, 255, 255), 2)
plt.imshow(img)
Obwohl es nicht perfekt ist, wird der Umriss meistens extrahiert.
Die Kontur wird mit vielen Scheitelpunkten gezeichnet, wenn auf Details geachtet wird. Wenn jedoch die Scheitelpunkte bis zu diesem Punkt nicht benötigt werden, kann die Kontur angenähert werden. Hier habe ich versucht, die Kontur des Fußteils anzunähern.
rinkakukinzi.py
img = cv2.imread('/brabra/6.jpg',0)
img = cv2.resize(img, dsize=None, fx=0.15, fy=0.15)
ret,thresh = cv2.threshold(img,59,255,0)
thresh= cv2.bitwise_not(thresh)
#Konturextraktion
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE)
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB) #In RGB-Format konvertieren
#Kontur des Fußteils
cnt = contours[7]
#Konturapproximation epsilon ist der Approximationsgrad
epsilon = 0.01*cv2.arcLength(cnt,True)
approx = cv2.approxPolyDP(cnt,epsilon,True)
#Zeichnen Sie eine ungefähre Kontur auf das Originalbild
cv2.drawContours(img, [approx], -1, (0, 255, 0), 2)
plt.imshow(img)
Es war schön und eckig.
Es ist möglich, eine Figur zu zeichnen, die die Kontur umschreibt. Ich zeichnete Umschreibungen, Kreise, Ellipsen und ähnliche Linien.
gaisetsu.py
img = cv2.imread('C:/brabra/6.jpg',0)
img = cv2.resize(img, dsize=None, fx=0.15, fy=0.15)
ret,thresh = cv2.threshold(img,59,255,0)
thresh= cv2.bitwise_not(thresh)
#Konturextraktion
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE)
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB) #In RGB-Format konvertieren
#Zeichnen Sie den Umriss des Fußes
cv2.drawContours(img, contours, 7, (0, 255, 0), 2)
cnt = contours[7]
#Externes Rechteck
x,y,w,h = cv2.boundingRect(cnt)
img0 = img.copy()
img0 = cv2.rectangle(img0,(x,y),(x+w,y+h),(0,255,0),2)
#Externes Rechteck unter Berücksichtigung der Drehung
rect = cv2.minAreaRect(cnt)
box = cv2.boxPoints(rect)
box = np.int0(box)
img00 = img.copy()
img00 = cv2.drawContours(img00,[box],0,(0,0,255),2)
#Minimaler umschreibender Kreis
(x,y),radius = cv2.minEnclosingCircle(cnt)
center = (int(x),int(y))
radius = int(radius)
img1 = img.copy()
img1 = cv2.circle(img1,center,radius,(0,255,255),2)
#Elliptische Anpassung
ellipse = cv2.fitEllipse(cnt)
img2 = img.copy()
img2 = cv2.ellipse(img2,ellipse,(255,255,0),2)
#Gerade Passform
rows,cols = img.shape[:2]
[vx,vy,x,y] = cv2.fitLine(cnt, cv2.DIST_L2,0,0.01,0.01)
lefty = int((-x*vy/vx) + y)
righty = int(((cols-x)*vy/vx)+y)
img3 = img.copy()
img3 = cv2.line(img3,(cols-1,righty),(0,lefty),(255,255,255),2)
plt.subplot(231),plt.imshow(img0)
plt.title('en'), plt.xticks([]), plt.yticks([])
plt.subplot(232),plt.imshow(img00)
plt.title('en'), plt.xticks([]), plt.yticks([])
plt.subplot(233),plt.imshow(img1)
plt.title('en'), plt.xticks([]), plt.yticks([])
plt.subplot(234),plt.imshow(img2)
plt.title('daen'), plt.xticks([]), plt.yticks([])
plt.subplot(235),plt.imshow(img3)
plt.title('line'), plt.xticks([]), plt.yticks([])
plt.show()
Ich vertiefte mein Verständnis der Konturextraktion.
--Bilderkennung (professionelle Serie für maschinelles Lernen) https://www.amazon.co.jp/dp/4061529129/
Recommended Posts