- 1. 분할 및 윤곽
- 2. 계층 구조 및 검색 모드
- 3. 윤곽선 근사화 및 볼록 껍질 찾기
- 4. 볼록 껍질
- 5. 모양에 따른 Contour 매칭
- 6. 모양 식별 (원, 직사각형, 삼각형, 정사각형, 별)
- 7. 라인 감지
- 8. Blob 감지
- 9. Blob 필터링 – 원과 타원 세기
이전 튜토리얼에서는 기본 이미지 처리를 위해 OpenCV를 사용하고 몇 가지 고급 이미지 편집 작업을 수행했습니다. 아시다시피 OpenCV는 C ++, Python 및 Java 인터페이스를 포함하고 Windows, Linux, Mac OS, iOS 및 Android를 지원하는 Open Source Commuter Vision Library 입니다. 따라서 Python 및 Linux 환경에서 Raspberry Pi에 쉽게 설치할 수 있습니다. 그리고 OpenCV와 연결된 카메라가있는 Raspberry Pi는 얼굴 감지, 얼굴 잠금, 물체 추적, 자동차 번호판 감지, 주택 보안 시스템 등과 같은 많은 실시간 이미지 처리 애플리케이션을 만드는 데 사용할 수 있습니다.이 자습서에서는 수행하는 방법을 배웁니다. OpenCV를 사용한 이미지 분할. 수행 할 작업은 다음과 같습니다.
- 분할 및 윤곽
- 계층 구조 및 검색 모드
- 윤곽을 근사화하고 볼록 껍질 찾기
- 코 넥스 헐
- 컨투어 일치
- 모양 식별 (원, 직사각형, 삼각형, 정사각형, 별표)
- 라인 감지
- 얼룩 감지
- 얼룩 필터링 – 원과 타원 계산
1. 분할 및 윤곽
이미지 분할 은 이미지를 다른 영역으로 분할하는 프로세스입니다. 반면 윤곽은 연속 선 또는 결합 또는 이미지 내의 오브젝트의 전체 경계를 덮 곡선이다. 그리고 여기 에서는 윤곽선이라는 이미지 분할 기술 을 사용하여 이미지 의 일부를 추출합니다.
또한 윤곽은
- 물체 감지
- 형상 분석
그리고 그들은 실제 이미지 분석에서 MRI와 같은 의료 이미지 분석에 이르기까지 매우 광범위한 응용 분야를 가지고 있습니다.
정사각형의 윤곽을 추출하여 opencv에서 윤곽을 구현하는 방법을 알아 보겠습니다.
import cv2 import numpy as np
3 개의 검은 색 사각형이있는 간단한 이미지를로드하겠습니다.
image = cv2.imread ('squares.jpg') cv2.imshow ('입력 이미지', 이미지) cv2.waitKey (0)
그레이 스케일
gray = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY)
멋진 가장자리 찾기
edged = cv2.Canny (gray, 30,200) cv2.imshow ('canny edge', edged) cv2.waitKey (0)
윤곽선 찾기
# 이미지 사본 사용, 예:-edged.copy (), 윤곽을 찾는 것은 이미지를 변경 하기 때문에 # OpenCV 버전 _, contours, hierarchy = cv2의 업그레이드로 인해 윤곽선 앞에 빈 인수로 _를 추가해야합니다 ..findContours (edged, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) cv2.imshow ('컨투어링 후 캐니 에지', 에지) cv2.waitKey (0)
윤곽이 무엇으로 구성되어 있는지 알기 위해 윤곽 파일 인쇄
print (contours) print ('찾은 윤곽선 수 ='+ str (len (contours)))
모든 윤곽 그리기
# 모든 윤곽선을 그리기위한 세 번째 매개 변수로 -1을 사용합니다 .cv2.drawContours (image, contours, -1, (0,255,0), 3) cv2.imshow ('contours', image) cv2.waitKey (0) cv2 . destroyAllWindows ()
콘솔 출력 -],],], …,],],]], dtype = int32), 정렬(],],
], …,
],],]], dtype = int32), array (],],], …,],],]], dtype = int32)]
발견 된 윤곽선 수 = 3. 그래서 우리는 총 세 개의 윤곽선을 찾았습니다.
이제 위의 코드에서를 사용하여 윤곽 파일을 인쇄했습니다 . 이 파일은 위의 콘솔 출력에 인쇄 된 것처럼 이러한 윤곽이 어떻게 보이는지 알려줍니다.
위의 콘솔 출력에는 x, y 포인트의 좌표처럼 보이는 행렬이 있습니다. OpenCV는 목록 목록에 윤곽선을 저장합니다. 위의 콘솔 출력을 다음과 같이 간단히 표시 할 수 있습니다.
컨투어 1 컨투어 2 컨투어 3
], 배열 (], 배열 (],],],],],],],
…,…,…,],],],],],],]], dtype = int32),]], dtype = int32),]], dtype = int32)]
이제 윤곽 파일에서 길이 함수를 사용하면 길이가 3이됩니다. 이는 해당 파일에 세 개의 목록 목록, 즉 세 개의 윤곽선이 있음을 의미합니다.
이제 CONTOUR 1 이 해당 배열의 첫 번째 요소이고 해당 목록에 모든 좌표의 목록이 포함되어 있고 이러한 좌표가 녹색 직사각형 상자처럼 방금 본 윤곽을 따라있는 점이라고 상상해보십시오.
이러한 좌표를 저장하는 방법에는 여러 가지가 있으며이를 근사 방법이라고합니다. 기본적으로 근사 방법은 두 가지 유형이 있습니다.
- cv2.CHAIN_APPROX_NONE
- cv2.CHAIN_APPROX_SIMPLE
cv2.CHAIN_APPROX_NONE 은 모든 경계 지점을 저장하지만 모든 경계 지점이 반드시 필요한 것은 아닙니다. 지점이 직선을 형성하는 경우 해당 선의 시작 지점과 끝 지점 만 필요합니다.
대신 cv2.CHAIN_APPROX_SIMPLE 은 경계 윤곽의 시작점과 끝점 만 제공하므로 윤곽 정보를 훨씬 더 효율적으로 저장할 수 있습니다.
_, contours, hierarchy = cv2.findContours (edged, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
위 코드에서 cv2.RETR_EXTERNAL 은 검색 모드이고 cv2.CHAIN_APPROX_NONE 은
근사 방법.
그래서 우리는 윤곽과 근사 방법에 대해 배웠습니다. 이제 계층과 검색 모드를 살펴 보겠습니다.
2. 계층 구조 및 검색 모드
검색 모드는 하위 윤곽, 외부 윤곽 또는 모든 윤곽과 같은 윤곽에서 계층 구조를 정의합니다.
이제 계층 유형에 따라 정렬 된 네 가지 검색 모드가 있습니다.
cv2.RETR_LIST – 모든 윤곽을 검색합니다.
cv2.RETR_EXTERNAL – 외부 또는 외부 윤곽 만 검색합니다.
cv2.RETR_CCOMP – 2 단계 계층 구조에서 모두 검색합니다.
cv2.RETR_TREE – 전체 계층 구조에서 모두 검색합니다.
계층은 다음 형식으로 저장됩니다.
이제 처음 두 검색 모드 인 cv2.RETR_LIST와 cv2.RETR_EXTERNAL의 차이점을 설명하겠습니다.
import cv2 import numpy as np
3 개의 검은 색 사각형이있는 간단한 이미지를로드 할 수 있습니다.
image = cv2.imread ('square donut.jpg') cv2.imshow ('input image', image) cv2.waitKey (0)
그레이 스케일
gray = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY)
캐니 에지 찾기
edged = cv2.Canny (gray, 30,200) cv2.imshow ('canny edge', edged) cv2.waitKey (0)
윤곽선 찾기
# 이미지의 복사본을 사용합니다. 예:-edged.copy (), 윤곽을 찾는 것은 이미지를 변경 하기 때문입니다 # 우리는 열린 cv 버전의 업그레이드로 인해 빈 인수로 윤곽 앞에 _를 추가해야합니다. _, contours, hierarchy = cv2.findContours (edged, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) cv2.imshow ('컨투어링 후 캐니 에지', 에지) cv2.waitKey (0)
윤곽이 무엇인지 알기 위해 윤곽 파일을 인쇄합니다.
print (contours) print ('찾은 윤곽선 수 ='+ str (len (contours)))
모든 윤곽 그리기
# -1을 세 번째 매개 변수로 사용하여 모든 윤곽선을 그립니다 .cv2.drawContours (image, contours, -1, (0,255,0), 3) cv2.imshow ('contours', image) cv2.waitKey (0) cv2 . destroyAllWindows
import cv2 import numpy as np
3 개의 검은 색 사각형이있는 간단한 이미지를로드 할 수 있습니다.
image = cv2.imread ('square donut.jpg') cv2.imshow ('input image', image) cv2.waitKey (0)
그레이 스케일
gray = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY)
멋진 가장자리 찾기
edged = cv2.Canny (gray, 30,200) cv2.imshow ('canny edge', edged) cv2.waitKey (0)
윤곽선 찾기
찾는 윤곽 이미지를 변경할 수 있기 때문에, edged.copy () - 이미지, 예를 들면의 사본을 #use #we 오픈 이력서 버전의 업그레이드로 인해 빈 인수로 윤곽 전에 _ 추가해야 _, 등고선, 계층 구조 = cv2.findContours (edged, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE) cv2.imshow ('컨투어링 후 캐니 에지', 에지) cv2.waitKey (0)
윤곽이 무엇으로 구성되어 있는지 알기 위해 윤곽 파일을 인쇄합니다.
print (contours) print ('찾은 윤곽선 수 ='+ str (len (contours)))
모든 윤곽 그리기
# 모든 윤곽선을 그리기위한 세 번째 매개 변수로 -1을 사용합니다 .cv2.drawContours (image, contours, -1, (0,255,0), 3) cv2.imshow ('contours', image) cv2.waitKey (0) cv2 . destroyAllWindows ()
따라서 위 코드의 데모를 통해 cv2.RETR_LIST 와 cv2.RETR_EXTERNNAL 의 차이점을 명확하게 확인할 수있었습니다. cv2.RETR_EXTERNNAL 에서는 외부 윤곽 만 고려되고 내부 윤곽은 무시됩니다.
에있는 동안 cv2.RETR_LIST 내부 윤곽도 고려되고있다.
3. 윤곽선 근사화 및 볼록 껍질 찾기
윤곽선을 근사화 할 때 윤곽선 모양은 다른 윤곽선 모양에 대해 근사화되며 첫 번째 윤곽선 모양과 그다지 유사하지 않을 수 있습니다.
근사를 위해 아래에 설명 된 openCV의 approxPolyDP 함수를 사용 합니다.
cv2.approxPolyDP (윤곽, 근사 정확도, 닫힘)
매개 변수:
- Contour – 근사화하려는 개별 윤곽입니다.
- 근사 정확도 - 근사 정확도 를 결정하는 데 중요한 매개 변수, 작은 값은 정확한 근사값을 제공하고 큰 값은 더 일반적인 정보를 제공합니다. 좋은 규칙은 윤곽선 둘레의 5 % 미만입니다.
- 닫힘 – 대략적인 윤곽선이 열리거나 닫힐 수 있는지 여부를 나타내는 부울 값입니다.
집의 단순한 모습을 근사화 해보자
np import cv2 로 numpy 가져 오기
이미지를로드하고 사본을 보관하십시오.
image = cv2.imread ('house.jpg') orig_image = image.copy () cv2.imshow ('원본 이미지', orig_image) cv2.waitKey (0)
이미지 그레이 스케일 및 이진화
gray = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY) ret, thresh = cv2.threshold (gray, 127,255, cv2.THRESH_BINARY_INV)
윤곽선 찾기
_, contours, hierarchy = cv2.findContours (thresh.copy (), cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
각 윤곽선을 반복하고 경계 사각형을 계산합니다.
윤곽선에서 c의 경우: x, y, w, h = cv2.boundingRect (c) cv2.rectangle (orig_image, (x, y), (x + w, y + h), (0,0,255), 2) cv2.imshow ('Bounding rect', orig_image) cv2.waitKey (0)
각 윤곽을 반복하고 대략적인 윤곽을 계산합니다.
컨투어에서 c의 경우:
# 윤곽 둘레 정확도 의 백분율로 정확도 계산 = 0.03 * cv2.arcLength (c, True) approx = cv2.approxPolyDP (c, accuracy, True) cv2.drawContours (image,, 0, (0,255,0), 2) cv2.imshow ('Approx polyDP', 이미지) cv2.waitKey (0) cv2.destroyAllWindows ()
4. 볼록 껍질
볼록 껍질은 기본적으로 주어진 그림 위에 선을 그리는 것으로 표현되는 바깥 쪽 가장자리입니다.
개체 자체에 맞출 수있는 가장 작은 다각형 일 수 있습니다.
import cv2 import numpy as np image = cv2.imread ('star.jpg') gray = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY) cv2.imshow ('original image', image) cv2.waitKey (0)
이미지 임계 값
ret, thresh = cv2.threshold (gray, 176,255,0)
윤곽 찾기
_, contours, hierarchy = cv2.findContours (thresh.copy (), cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
영역별로 윤곽선을 정렬 한 다음 가장 큰 프레임 윤곽선을 제거합니다.
n = len (contours) -1 contours = sorted (contours, key = cv2.contourArea, reverse = False)
윤곽선을 반복하고 볼록 껍질을 그립니다.
컨투어에서 c의 경우:
hull = cv2.convexHull (c) cv2.drawContours (image,, 0, (0,255,0), 2) cv2.imshow ('convex hull', image) cv2.waitKey (0) cv2.destroyAllWindows ()
5. 모양에 따른 Contour 매칭
cv2.matchShapes (윤곽 템플릿, 윤곽 메서드, 메서드 매개 변수)
출력 – 일치 값 (낮은 값은 더 가까운 일치를 의미 함)
윤곽 템플릿 – 새 이미지에서 찾으려고하는 기준 윤곽선입니다.
contour – 우리가 검사하는 개별 윤곽.
방법 – 윤곽 일치 유형 (1,2,3).
메소드 매개 변수 – 0.0으로 그대로 두십시오 (python opencv에서는 사용되지 않음).
import cv2 import numpy as np
모양 템플릿 또는 참조 이미지로드
template = cv2.imread ('star.jpg', 0) cv2.imshow ('template', template) cv2.waitKey (0)
일치하려는 모양으로 대상 이미지를로드합니다.
target = cv2.imread ('shapestomatch.jpg') gray = cv2.cvtColor (target, cv2.COLOR_BGR2GRAY)
cv2.findContours 를 사용하기 전에 먼저 두 이미지를 임계 값으로 설정합니다.
ret, thresh1 = cv2.threshold (template, 127,255,0) ret, thresh2 = cv2.threshold (gray, 127,255,0)
템플릿에서 윤곽 찾기
_, contours, hierarhy = cv2.findContours (thresh1, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE) # 가장 큰 윤곽선을 제거 할 수 있도록 윤곽선을 영역별로 정렬해야합니다.
이미지 개요
sorted_contours = sorted (contours, key = cv2.contourArea, reverse = True) # 우리는 템플릿 윤곽이 될 두 번째로 큰 윤곽을 추출합니다. tempelate_contour = contours # 두 번째 대상 이미지에서 윤곽을 추출합니다. _, contours, hierarchy = cv2.findContours (thresh2, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE) for c in contours: # 대상 이미지의 각 윤곽선을 반복하고 cv2.matchShape를 사용하여 윤곽선 모양을 비교합니다. match = cv2.matchShapes (tempelate_contour, c, 1,0.0) print ("match") # 일치 값이 0.15 미만인 경우 match <0.16: 가장 가까운 _contour = c else: 가장 가까운 _contour = cv2.drawContours (target,,-1, (0,255,0), 3) cv2.imshow ('output',표적) cv2.waitKey (0) cv2.destroyAllWindows ()
콘솔 출력 –
0.16818605122199104
0.19946910256158912
0.18949760627309664
0.11101058276281539
수학 함수가 다른 세 가지 방법이 있습니다. 1,2와 3에서 다른 cv2.matchShapes (tempelate_contour, c, 1, 0.0) 방법 값을 바꾸는 것만으로 각 방법을 실험 할 수 있습니다. 콘솔 출력의 값.
6. 모양 식별 (원, 직사각형, 삼각형, 정사각형, 별)
OpenCV는 이미지에서 다양한 유형의 모양을 자동으로 감지하는 데 사용할 수도 있습니다. 아래 코드를 사용하여 이미지에서 원, 직사각형, 삼각형, 정사각형 및 별을 감지 할 수 있습니다.
import cv2 import numpy as np
이미지를로드 한 다음 그레이 스케일
image = cv2.imread ('shapes.jpg') gray = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY) cv2.imshow ('identifying shapes', image) cv2.waitKey (0) ret, thresh = cv2.threshold (gray, 127,255,1)
윤곽 추출
_, contours, hierarchy = cv2.findContours (thresh.copy (), cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
컨투어의 cnt:
대략적인 다각형을 가져옵니다. approx = cv2.approxPolyDP (cnt, 0.01 * cv2.arcLength (cnt, True), True) if len (approx) == 3: shape_name = "Triangle" cv2.drawContours (image,, 0, (0,255, 0),-1)
중앙에 텍스트를 배치 할 윤곽선 중심 찾기
M = cv2.moments (cnt) cx = int (M / M) cy = int (M / M) cv2.putText (image, shape_name, (cx-50, cy), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0, 0), 1) elif len (대략) == 4: x, y, w, h = cv2.boundingRect (cnt) M = cv2.moments (cnt) cx = int (M / M) cy = int (M /미디엄)
4면 다각형이 정사각형인지 직사각형인지 확인하십시오.
# cv2.boundingRect는 왼쪽 상단에서 시작하여 픽셀 단위로 왼쪽 너비와 높이를 반환합니다. #left corner, square의 경우 abs (wh) <= 3: shape_name = "square"# 텍스트를 배치 할 윤곽선 중심 찾기 center cv2.drawContours (image,, 0, (0,125,255),-1) cv2.putText (image, shape_name, (cx-50, cy), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,0), 1) else: shape_name = "Reactangle"# 텍스트를 중앙에 배치 할 윤곽 중심 찾기 cv2.drawContours (image,, 0, (0,0,255),-1) M = cv2.moments (cnt) cx = int (M / M) cy = int (M / M) cv2.putText (image, shape_name, (cx-50, cy), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,0), 1) elif len (approx) == 10: shape_name = '별' cv2.drawContours (image,, 0, (255,255,0),-1) M = cv2.moments (cnt) cx = int (M / M) cy = int (M / M) cv2.putText (image, shape_name, (cx-50, cy), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,0), 1) elif len (approx)> = 15: shape_name = ' circle'cv2.drawContours (image,, 0, (0,255,255), -1) M = cv2.moments (cnt) cx = int (M / M) cy = int (M / M) cv2.putText (image, shape_name, (cx-50, cy), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,0), 1) cv2.imshow ('모양 식별', 이미지) cv2.waitKey (0) cv2.destroyAllWindows ()
7. 라인 감지
라인 감지는 OpenCV 에서 매우 중요한 개념이며 실제 세계에서 유망한 용도로 사용됩니다. 자율 주행 차는 차선과 도로를 감지하기 위해 선 감지 알고리즘을 사용합니다.
라인 감지에서 우리는 두 가지 알고리즘을 다룰 것입니다.
- 허프 라인 알고리즘
- Probalistic Hough Line Algorithm.
y = mx + c 방정식을 사용하여 고등학교 수학에서 선을 표현한 것을 기억했을 것 입니다.
그러나 OpenCV에서 라인은 다른 방식으로 표현됩니다.
위의 방정식 ρ = xcosӨ + ysincosӨ는 선의 OpenCV 표현입니다. 여기서 ρ는 원점에서 선의 수직 거리이고 Ө는 원점에 대한이 선의 법선에 의해 형성되는 각도입니다 (라디안으로 측정, 여기서 1pi 라디안 / 180 = 1도).
라인 감지를위한 OpenCV 기능은 다음과 같이 제공됩니다.
cv2.HoughLines (이진화 된 이미지, ρ 정확도, Ө 정확도, 임계 값), 여기서 임계 값은 선으로 간주되는 최소 투표입니다.
이제 opencv의 Hough line 함수를 사용하여 상자 이미지의 선을 감지 해 보겠습니다.
import cv2 import numpy as np image = cv2.imread ('box.jpg')
그레이 스케일 및 캐니 에지 추출
gray = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY) edge = cv2.Canny (gray, 100,170, apertureSize = 3)
1 픽셀의 rho 정확도를 사용하여 Hough 라인 실행
# 1 도인 (np.pi / 180)의 세타 정확도 # 라인 임계 값은 240 (라인상의 포인트 수)로 설정됩니다. lines = cv2.HoughLines (edges, 1, np.pi / 180, 240) #we iterate 각 라인을 통해 cv2.lines에 의해 요구되는 형식으로 변환합니다 (즉, end point가 필요함) for i in range (0, len (lines)): for rho, theta in lines: a = np.cos (theta) b = np.sin (theta) x0 = a * rho y0 = b * rho x1 = int (x0 + 1000 * (-b)) y1 = int (y0 + 1000 * (a)) x2 = int (x0-1000 * (-b)) y2 = int (y0-1000 * (a)) cv2.line (image, (x1, y1), (x2, y2), (0,255,0), 2) cv2.imshow ('hough lines', 이미지) cv2.waitKey (0) cv2.destroyAllWindows ()
이제 확률 적 허프 라인의 다른 알고리즘으로 위 라인 감지를 반복 해 봅시다.
확률 적 허프 라인의 기본 개념은 라인 감지에 충분한 지점의 무작위 하위 집합을 취하는 것입니다.
확률 적 허프 라인에 대한 OpenCV 함수는 cv2.HoughLinesP (이진화 된 이미지, ρ 정확도, Ө 정확도, 임계 값, 최소 라인 길이, 최대 라인 간격)로 표시됩니다.
이제 확률 적 허프 라인을 사용하여 박스 라인을 감지 해 봅시다.
import cv2 import numpy as np
그레이 스케일 및 캐니 에지 추출
화상 cv2.imread = ('box.jpg') 회색 = cv2.cvtColor (화상 cv2.COLOR_BGR2GRAY) 가장자리 = cv2.Canny (회색, 50,150은 apertureSize = 3) 우리는 같은 RHO 세타 정밀도 사용 #again #however을, 우리는 100의 최소 표 (선을 따라 pts)를 지정하고 # 최소 선 길이는 5 픽셀이고 선 사이의 최대 간격은 10 픽셀 선 = cv2.HoughLinesP (edges, 1, np.pi / 180,100,100,10) for i in range (0, len (lines)): for x1, y1, x2, y2 in lines: cv2.line (image, (x1, y1), (x2, y2), (0,255,0), 3) cv2 . imshow ('probalistic hough lines', image) cv2.waitKey (0) cv2.destroyAllWindows
8. Blob 감지
Blob은 모두 공통 속성을 공유하는 연결된 픽셀 그룹으로 설명 할 수 있습니다. OpenCV blob 검출기를 사용하는 방법은이 순서도를 통해 설명됩니다.
요점을 그리기 위해 다음 인수를 받는 cv2.drawKeypoints 를 사용 합니다.
cv2.drawKeypoints (입력 이미지, 키포인트, 빈 _ 출력 _ 배열, 색상, 플래그)
깃발이있을 수있는 곳
cv2.DRAW_MATCHES_FLAGS_DEFAULT
cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS
cv2.DRAW_MATCHES_FLAGS_DRAW_OVER_OUTIMG
cv2.DRAW_MATCHES_FLAGS_NOT_DRAW_SINGLE_POINTS
그리고 빈 여기가 제로의 한 행렬 거의 아무것도 그러나 사람은 없다
이제 해바라기 이미지에 대해 얼룩 감지를 수행해 보겠습니다. 여기서 얼룩은 모든 꽃에서 공통적이므로 꽃의 중앙 부분이됩니다.
import cv2 import numpy as np image = cv2.imread ('Sunflowers.jpg', cv2.IMREAD_GRAYSCALE)
기본 매개 변수로 감지기 설정
detector = cv2.SimpleBlobDetector_create ()
Blob 감지
keypoints = detector.detect (이미지)
감지 된 얼룩을 빨간색 원으로 그립니다.
# cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS #size of circle이 blob의 크기와 일치 하는지 확인 blank = np.zeros ((1,1)) blobs = cv2.drawKeypoints (image, keypoints, blank, (0,255,255), cv2.DRAW_MATCHES_FLAGS_DEFAULT)
키포인트 표시
cv2.imshow ('blobs', blobs) cv2.waitKey (0) cv2.destroyAllWindows ()
코드가 잘 작동하지만 앞쪽의 꽃이 끝에있는 꽃에 비해 크기가 크기 때문에 꽃의 크기가 고르지 않아 일부 얼룩이 누락됩니다.
9. Blob 필터링 – 원과 타원 세기
모양, 크기 및 색상에 따라 블롭을 필터링하기 위해 매개 변수를 사용할 수 있습니다. Blob 검출기와 함께 매개 변수를 사용하려면 OpenCV의 기능을 사용합니다.
cv2.SimpleBlobDetector_Params ()
주로 아래에 나열된 네 가지 매개 변수로 blob을 필터링하는 것을 볼 수 있습니다.
지역
params.filterByArea = True / False params.minArea = 픽셀 params.maxArea = 픽셀
둥글 원형
params.filterByCircularity = True / False params.minCircularity = 1은 완벽하고 0은 반대입니다.
Convexity-Blob 영역 / 볼록 껍질 영역
params.filterByConvexity = True / False params.minConvexity = Area
관성
params.filterByInertia = True / False params.minInertiaRatio = 0.01
이제 위에서 언급 한 매개 변수로 blob을 필터링 해 보겠습니다.
import cv2 import numpy as np image = cv2.imread ('blobs.jpg') cv2.imshow ('original image', image) cv2.waitKey (0)
기본 매개 변수를 사용하여 감지기 초기화
detector = cv2.SimpleBlobDetector_create ()
Blob 감지
keypoints = detector.detect (이미지)
이미지에 빨간색 원으로 얼룩을 그립니다.
blank = np.zeros ((1,1)) blobs = cv2.drawKeypoints (image, keypoints, blank, (0,0,255), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) number_of_blobs = len (keypoints) text = "총 얼룩 수"+ str (len (keypoints)) cv2.putText (blobs, text, (20,550), cv2.FONT_HERSHEY_SIMPLEX, 1, (100,0,255), 2)
Blob 키포인트로 이미지 표시
cv2.imshow ('기본 매개 변수를 사용하는 blob', blobs) cv2.waitKey (0)
필터링 매개 변수 설정
# cv2.SimpleBlobDetector params = cv2.SimpleBlobDetector_Params ()를 사용하여 매개 변수 설정을 초기화합니다.
영역 필터링 매개 변수 설정
params.filterByArea = 참 params.minArea = 100
순환 성 필터링 매개 변수 설정
params.filterByCircularity = True params.minCircularity = 0.9
볼록성 필터링 매개 변수 설정
params.filterByConvexity = 거짓 params.minConvexity = 0.2
관성 필터링 매개 변수 설정
params.filterByInertia = 참 params.minInertiaRatio = 0.01
매개 변수로 감지기 만들기
detector = cv2.SimpleBlobDetector_create (params)
Blob 감지
keypoints = detector.detect (이미지)
이미지에 빨간색 원으로 얼룩을 그립니다.
blank = np.zeros ((1,1)) blobs = cv2.drawKeypoints (image, keypoints, blank, (0,255,0), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) number_of_blobs = len (keypoints) text = "원형 얼룩의 총 수"+ str (len (keypoints)) cv2.putText (blobs, text, (20,550), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,100,255), 2)
Blob 표시
cv2.imshow ('순환 blob 필터링', blobs) cv2.waitKey (0) cv2.destroyAllWindows ()
이것이 Python-OpenCV에서 이미지 분할이 수행되는 방법입니다. 컴퓨터 비전과 OpenCV를 잘 이해하려면 이전 기사 (Python OpenCV 및 이미지 조작 시작하기 Python OpenCV에서 컴퓨터 비전으로 멋진 것을 만들 수 있습니다.