OpenCV-Python 윤곽 구현 특징 값

10152 단어 OpenCV윤곽특징 값
머리말
윤곽 자체 의 일부 속성 특징 과 윤곽 이 둘러싸 인 대상 의 특징 은 이미 지 를 묘사 하 는 데 중요 한 의 미 를 가진다.이 박문 은 윤곽 자체 의 속성 특징 과 윤곽 포위 대상 의 특징 을 소개 할 것 이다.
너비
윤곽 에서 우 리 는 너비 와 높이 비 교 를 통 해 윤곽 을 묘사 할 수 있다.예 를 들 어 사각형 의 윤곽 너비 와 높이 는 다음 과 같다.
너비
다음은 사각형 윤곽 의 너비 와 높이 를 계산 합 니 다.코드 는 다음 과 같 습 니 다.

import cv2

img = cv2.imread("26_1.jpg")
cv2.imshow("img", img)

#        
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

ret, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(binary, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)

x, y, w, h = cv2.boundingRect(contours[0])
cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), 3)
cv2.imshow("img1", img)

aspectRatio=float(w)/h
print(aspectRatio)

cv2.waitKey()
cv2.destroyAllWindows()
운행 후에 우 리 는 윤곽 의 너비 와 높이 를 약 3 으로 얻 을 수 있다.
宽高比
Extend
우 리 는 또한 윤곽 면적 과 사각형 경계 면적 의 비례 Extend 를 사용 하여 이미지 와 그 윤곽 특징 을 묘사 할 수 있다.수학 계산 공식 도 에서:
확장=윤곽 면적/직사각형 경계 면적
다음은 Extend 를 계산 하 겠 습 니 다.코드 는 다음 과 같 습 니 다.

import cv2

img = cv2.imread("26_1.jpg")
cv2.imshow("img", img)

#        
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

ret, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(binary, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)

x, y, w, h = cv2.boundingRect(contours[0])
rectArea=w*h#      
cntArea=cv2.contourArea(contours[0])#    
extend=float(cntArea)/rectArea
print(extend)
이 예 에서 윤곽 면적 과 사각형 경계 면적 의 비례 는 약 0.8 이다.
0.7
Solidity
우 리 는 또한 윤곽 면적 과 돌출 면적 의 비례 Solity 를 사용 하여 이미지,윤곽 과 돌출 된 특징 을 평가 할 수 있다.그 수학 계산 공식 은 다음 과 같다.
Slidity=윤곽 면적/돌출 면적
다음은 Slidity 를 계산 하 겠 습 니 다.코드 는 다음 과 같 습 니 다.

import cv2

img = cv2.imread("26_1.jpg")
cv2.imshow("img", img)

#        
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

ret, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(binary, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)

x, y, w, h = cv2.boundingRect(contours[0])
cntArea=cv2.contourArea(contours[0])#    
hull=cv2.convexHull(contours[0])
hullArea=cv2.contourArea(hull)#    
solidity=float(cntArea)/hullArea
print(solidity)
운행 후,본 사례 의 윤곽 면적 과 돌출 면적 의 비례 는 solidity 가 약 1:
比例
등가 직경
OpenCV 에서 우 리 는 윤곽 면적 과 같은 원형의 지름 인 등 효 직경 을 사용 하여 윤곽 의 특징 값 을 평가 할 수 있다.그 수학 계산 공식 은 다음 과 같다.
等效直径
다음은 윤곽 면적 과 같은 원형 지름 을 계산 하 겠 습 니 다.코드 는 다음 과 같 습 니 다.

import cv2
import numpy as np

img = cv2.imread("26_1.jpg")
cv2.imshow("img", img)

#        
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

ret, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(binary, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)

x, y, w, h = cv2.boundingRect(contours[0])
cntArea=cv2.contourArea(contours[0])#    
equiDiameter=np.sqrt(4*cntArea/np.pi)
print(equiDiameter)
cv2.circle(img,(100,100),int(equiDiameter/2),(0,255,0),3)
cv2.imshow("img1",img)
cv2.waitKey()
cv2.destroyAllWindows()
운행 한 후에 우 리 는 그 같은 효 과 를 얻 은 지름 이 약 145 이다.
等效直径
방향.
OpenCV 에서 함수 cv2.fitEllipe()는 가장 적합 한 타원 을 구축 할 수 있 고 반환 값 에서 타원 의 중심 점,축 길이,회전 각도 정 보 를 각각 되 돌려 줄 수 있다.이런 형식 을 사용 하면 타원 의 방향 등 정 보 를 직관 적 으로 얻 을 수 있다.
함수 cv2.fitEllipe()반환 값 은:
(x,y):타원 의 중심 점
(MA,ma):타원 수평 방향 축 과 수직 방향 축의 길이
angle:타원 회전 각도

import cv2

img = cv2.imread("26_1.jpg")
cv2.imshow("img", img)

#        
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

ret, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(binary, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)

ellipsis=cv2.fitEllipse(contours[0])

(x, y), (MA, ma), angle = cv2.fitEllipse(contours[0])

print((x, y), (MA, ma), angle)

cv2.ellipse(img, ellipsis, (0, 255, 0), 2)
cv2.imshow("img1", img)
cv2.waitKey()
cv2.destroyAllWindows()
원래 타원 도 이 고 아래 를 맞 추 면 타원 이다.
椭圆
마스크 와 픽 셀 점
때때로 우 리 는 어떤 대상 의 마스크 이미지 와 그 에 대응 하 는 점 을 얻 는 것 과 같다.OpenCV 에서 cv2.find NonZero()함 수 를 제공 하여 그림 의 윤곽 점 위 치 를 가 져 옵 니 다.전체 정 의 는 다음 과 같 습 니 다.

def findNonZero(src, idx=None): 
src:0 요소 가 아 닌 그림 을 찾 으 려 면
idx:0 요소 가 아 닌 색인 위 치 를 되 돌려 줍 니 다.구체 적 인 형식 은(줄 번호,열 번호)
아래,우 리 는 이 함 수 를 실측 합 니 다.코드 는 다음 과 같 습 니 다.

import cv2
import numpy as np

img = cv2.imread("26_1.jpg")

cv2.imshow("img", img)

#        
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

ret, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(binary, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)

mask=np.zeros(gray.shape,np.uint8)
cv2.drawContours(mask,[contours[0]],0,255,2)
pixelpoints=cv2.findNonZero(mask)
print(pixelpoints)

cv2.imshow("img1", mask)
cv2.waitKey()
cv2.destroyAllWindows()
실행 한 후에 우 리 는 윤곽 점 의 위 치 를 얻 을 수 있 습 니 다.
轮廓点位置
최대 치,최소 치 및 위치
OpenCV 에서 cv2.minMaxLoc()함 수 를 제공 하여 지정 한 대상 의 최대 값,최소 값 과 위치 등 정 보 를 가 져 옵 니 다.전체 정 의 는 다음 과 같 습 니 다.

def minMaxLoc(src, mask=None): 
src:단일 채널 이미지
마스크:마스크,마스크 를 사용 하여 그림 을 만 져 서 마스크 가 지정 한 영역 에서 가장 값 진 정 보 를 얻 을 수 있 습 니 다.
이 함 수 는 4 개의 값 을 되 돌려 줍 니 다:최소 값,최대 값,최소 값 위치,최대 값 위치.
다음은 이 값 을 가 져 오 겠 습 니 다.코드 는 다음 과 같 습 니 다.

import cv2
import numpy as np

img = cv2.imread("26_1.jpg")

cv2.imshow("img", img)

#        
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

ret, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(binary, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)

mask = np.zeros(gray.shape, np.uint8)
cv2.drawContours(mask, [contours[0]], 0, 255, 2)

min, max, min_loc, max_loc = cv2.minMaxLoc(gray, mask)
print(min, max, min_loc, max_loc)
실행 후 콘 솔 출력 4 개 값:
最小值
평균 색상 및 평균 그 레이스 케 일
OpenCV 에서,이것 은 우리 에 게 cv2.mean()함 수 를 제공 하여 대상 의 평균 색깔 과 평균 그 레이스 케 일 을 계산한다.그 전체 정 의 는 다음 과 같다.

def mean(src, mask=None):
매개 변 수 는 위의 두 마디 와 마찬가지 로 여기 서 군말 하지 않 는 다.다음은 이 함 수 를 사용 하 겠 습 니 다.코드 는 다음 과 같 습 니 다.

import cv2
import numpy as np

img = cv2.imread("26_1.jpg")


cv2.imshow("img", img)

#        
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

ret, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(binary, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)

mask=np.zeros(gray.shape,np.uint8)
cv2.drawContours(mask,[contours[0]],0,255,2)

mean=cv2.mean(img,mask)
실행 후 출력 4 개 값:RGB 및 A 채널 의 평균 값:
颜色平均值
극점
때때로 우 리 는 어떤 대상 안의 극점 을 얻 고 싶다.예 를 들 어 가장 왼쪽,가장 오른쪽,가장 위,가장 하등 이다.OpenCV 에서 다음 과 같은 방법 을 제공 합 니 다.

left=tuple(cnt[cnt[:,:,0].argmin()][0])
right=tuple(cnt[cnt[:,:,0].argmax()][0])
top=tuple(cnt[cnt[:,:,1].argmin()][0])
bottom=tuple(cnt[cnt[:,:,1].argmax()][0])
다음,우 리 는 이러한 방법 을 통 해 얻 을 수 있 습 니 다.코드 는 다음 과 같 습 니 다.

import cv2
import numpy as np

img = cv2.imread("26_1.jpg")

cv2.imshow("img", img)

#        
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

ret, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(binary, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)

mask = np.zeros(img.shape, np.uint8)
cnt = contours[0]
left = tuple(cnt[cnt[:, :, 0].argmin()][0])
right = tuple(cnt[cnt[:, :, 0].argmax()][0])
top = tuple(cnt[cnt[:, :, 1].argmin()][0])
bottom = tuple(cnt[cnt[:, :, 1].argmax()][0])

print(left, right, top, bottom)

font = cv2.FONT_HERSHEY_SIMPLEX

cv2.putText(img, "left", left, font, 1, (0, 255, 0), 2)
cv2.putText(img, "right", right, font, 1, (0, 255, 0), 2)
cv2.putText(img, "top", top, font, 1, (0, 255, 0), 2)
cv2.putText(img, "bottom", bottom, font, 1, (0, 255, 0), 2)

cv2.imshow("result",img)
cv2.waitKey()
cv2.destroyAllWindows()
실행 후,값 과 효 과 는 다음 과 같 습 니 다:
上下左右
여기 서 OpenCV-Python 의 윤곽 을 실현 하 는 특징 값 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 OpenCV 윤곽 에 관 한 특징 값 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 부 탁 드 리 겠 습 니 다!

좋은 웹페이지 즐겨찾기