Python 은 opencv 의 간단 한 이미지 윤곽 모양 인식(전체 네트워크 에서 가장 간단 하고 최소 코드)을 기반 으로 합 니 다.

마지막 전체 코드 로 바로 넘 어가 서 아주 적은 코드 인지 확인 할 수 있 습 니 다!!!
생각:
1.데이터 통합
2.그림 의 그 레이스 케 일 전환
3.그림 의 이치 전환
4.그림 의 윤곽 인식
5.그림 의 정점 획득
6.정점 수 에 따라 이미지 모양 판단
1.원 데이터 의 전시
在这里插入图片描述
사진 파일 은 모두 36 개의 폴 더 로 폴 더 마다 100 장의 그림,총 3600 장의 그림 이 있다.
在这里插入图片描述
모든 폴 더 에는 이와 같은 도형 이 있다.
2.데이터 의 통합
여러 폴 더 에 대해 분석 하기 가 매우 불편 합 니 다.모든 결정 은 하나의 폴 더 에 놓 고 분석 합 니 다.python 에서 다음 과 같이 구체 적 으로 이 루어 집 니 다.
이번에 필요 한 가방.

import cv2
import os
from PIL import Image
import matplotlib.pyplot as plt
import numpy as np

a=os.listdir('C:\\Users\\dell\\Desktop\\OpenCVProofSet')#          
for i in range(len(a)):
 	b=os.listdir('C:\\Users\\dell\\Desktop\\OpenCVProofSet\\'+a[i])#             
 for j in range(len(b)):
  c=Image.open('C:\\Users\\dell\\Desktop\\OpenCVProofSet\\'+a[i]+'\\'+b[j])#          
  c.save('C:\\Users\\dell\\Desktop\\cleardata\\'+str(i)+'_'+str(j)+'.png')#                        
결 과 는 다음 과 같다.
在这里插入图片描述
3.그림 윤곽 의 확정
3.1 그림 의 그 레이스 케 일 처리
다음은 한 장의 그림 을 예 로 들 어 설명 한다.
그 레이스 케 일 처리 에 대해 opencv 의 cv2.cvtColor 함 수 를 선택 하 십시오.코드 예 시 는 다음 과 같 습 니 다.

d=os.listdir('C:\\Users\\dell\\Desktop\\cleardata\\')#    
e=cv2.imread('C:\\Users\\dell\\Desktop\\cleardata\\'+d[5])#          
plt.imshow(e)#     
在这里插入图片描述
그 레이스 케 일의 전환 진행:

g=cv2.cvtColor(e,cv2.COLOR_BGR2GRAY)##    
3.2 그림 의 2 치 전환
그림 의 2 값 전환 에 대해 cv2.threshold 함 수 를 선택 하 십시오.코드 예 시 는 다음 과 같 습 니 다.

r,b=cv2.threshold(g,0,255,cv2.THRESH_OTSU)#    ,  0        255,    0      0
상기 코드 의 첫 번 째 매개 변 수 는 그 레이스 케 일 도형 이 고 두 번 째 매개 변 수 는 한도 값 입 니 다.즉,0 이상 의 픽 셀 점 이 255 로 전환 한 다음 에 선택 한 THRESH 입 니 다.OTSU 방법 은 다음 과 같이 구체 적 으로 설명 한다.
일반적인 상황 에서 우 리 는 일반적으로 어떤 한도 값 thresh 를 설정 해 야 비교적 좋 은 이치 화 효 과 를 얻 을 수 있 는 지 모 르 고 시험 해 볼 수 밖 에 없다.예 를 들 어 한 폭 의 쌍 봉 이미지(이미지 직사 도 에 두 개의 봉 이 존재 하 는 것 으로 이해)에 대해 우리 가 지정 한 한도 값 은 가능 한 한 두 개의 봉 사이 의 봉 곡 에 있어 야 한다.이때 네 번 째 인자 THRESH 를 사용 할 수 있 습 니 다.OTSU 는 쌍 봉 이미지 에 대해 직사 도 에 따라 적당 한 한도 값 을 자동 으로 계산 합 니 다(비 쌍 봉 도 에 대해 이런 방법 으로 얻 은 결 과 는 이상 적 이지 않 을 수 있 습 니 다).
쌍 봉 도 에 대해 서 는 cv2.THRESH 인 자 를 하나 더 입력 해 야 합 니 다.OTSU,그리고 한도 값 thresh 를 0 으로 설정 하면 알고리즘 은 가장 좋 은 한도 값 을 찾 고 첫 번 째 반환 값 ret 로 돌아 갑 니 다.
그 중에서 두 개의 값 을 되 돌려 주 고 두 번 째 값 은 이치 화 된 도형 행렬 이다.
3.3 윤곽 찾기
윤곽 찾기 에 있어 서 cv2.find Contours 방식 을 사용 합 니 다.코드 예 시 는 다음 과 같다.

cr,t=cv2.findContours(b, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)##    ,          ,             ,
#              
상기 함수 의 매개 변수 에서 첫 번 째 매개 변 수 는 이치 화 된 행렬 이 고 두 번 째 매개 변 수 는 윤곽 을 얻 는 방식 이 며 세 번 째 매개 변 수 는 윤곽 을 정의 하 는 유사 방식 이다.뒤의 두 매개 변수의 구체 적 인 설명 은 다음 과 같다.
在这里插入图片描述
위 에서 얻 은 결과 중 첫 번 째 결 과 는 윤곽 점 의 집합 이다.
경계 윤곽 을 그립 니 다.함 수 를 사용 하 는 것 은 cv2.drawContours 입 니 다.코드 예 는 다음 과 같 습 니 다.

plt.imshow(cv2.drawContours(e,cr,-1,50))#    ,                ,        ,        ,
#             ,          
상기 함수 에서 첫 번 째 매개 변 수 는 원시 도형 이 고 두 번 째 매개 변 수 는 얻 은 윤곽 점 의 집합 이 며 세 번 째 매개 변 수 는 모든 윤곽 점 을 그 리 는 것 을 대표 하 며 네 번 째 매개 변 수 는 선의 굵기 이다.
얻 은 결 과 는 다음 과 같다.
在这里插入图片描述
좌표 축의 윤곽 과 오각별 의 윤곽 이 모두 그 려 진 것 을 발견 할 수 있다.
3.4 윤곽 이 가 까 워 지고 정점 을 얻는다.
윤곽 점 을 얻 은 후에 윤곽 의 정점 을 얻어 야 합 니 다.정점 을 통 해 구체 적 인 어떤 도형 을 얻 을 수 있 습 니까?윤곽 이 가 까 워 질 때 두 가지 함 수 를 사용 합 니 다.cv2.arcLength,cv2.approx PolyDP,코드 예 는 다음 과 같 습 니 다.

ep = 0.01*cv2.arcLength(cr[1], True)#        cr[0]       ,      ,        
ap = cv2.approxPolyDP(cr[1], ep, True)#          
cv2.arcLength 는 윤곽 점 이 형 성 된 곡선 으로 둘러싸 인 도형 의 둘레 를 얻 었 다.cr[1]은 안쪽 오각별 의 윤곽 점 을 대표 한다.cr 안에 두 개의 윤곽 집합 이 있 기 때문에 하 나 는 바깥쪽 좌표 축의 윤곽 점 집합 이 고 하 나 는 안쪽 오각별 의 윤곽 점 집합 이다.트 루 는 닫 힌 곡선 을 대표 한다.이 를 1%를 다음 함수 의 한도 값 으로 한다.
cv2.approx PolyDP 는 그 가 얻 은 윤곽 점 을 선별 합 니 다(설 정 된 한도 값 과 실제 선 을 비교 합 니 다).그 선별 기준 은 바로 이전 함수 가 얻 은 1%의 둘레 입 니 다.이 값 보다 큰 점 은 버 리 고 이 값 보다 작은 점 은 보류 합 니 다.True 는 여전히 폐쇄 곡선 을 대표 합 니 다.
在这里插入图片描述
상기 절 차 를 통 해 일부 점 을 보류 할 수 있다.이런 점 은 바로 정점 을 얻 는 것 이다.
정점 수:

len(ap)#        10  
在这里插入图片描述
4.정점 에 따라 모양 을 판단 한다.
얻 은 정점 수 에 따라 모양 을 판단 할 수 있다.세 개의 정점 은 삼각형 이 고 네 개 는 직사각형 이 며 열 개 는 오각별 이 고 열 개 이상 은 원형 이다.위 와 같은 전체 코드 는 다음 과 같 습 니 다.

import cv2
import os
from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
d=os.listdir('C:\\Users\\dell\\Desktop\\cleardata\\')
for i in range(len(d)):
 e=cv2.imread('C:\\Users\\dell\\Desktop\\cleardata\\'+d[i])
 g=cv2.cvtColor(e,cv2.COLOR_BGR2GRAY)
 r,b=cv2.threshold(g,0,255,cv2.THRESH_OTSU)
 cr,t=cv2.findContours(b, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
 ep = 0.01*cv2.arcLength(cr[1], True)
 ap = cv2.approxPolyDP(cr[1], ep, True)
 co=len(ap)
 if co==3:
  st='   '
 elif co==4:
  st='  '
 elif co==10:
  st='   '
 else:
  st=' '  
 plt.imsave('C:\\Users\\dell\\Desktop\\  \\'+st+str(e[100][100])+str(i)+'.jpg',e)#        RGB      
여기 서 나 는 도형 의 중심 점 을 찍 어서 그림 의 색 을 얻 고 싶다.그것 은 RGB 값 을 얻 고 RGB 값 을 통 해 색 을 얻 을 수 있다.
최종 결 과 는 다음 과 같다.
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
이 글 은 opencv 기반 의 간단 한 이미지 윤곽 모양 인식(전체 네트워크 에서 가장 간단 하고 최소 코드)에 관 한 글 을 소개 합 니 다.더 많은 opencv 이미지 윤곽 모양 인식 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 도 많은 지원 을 바 랍 니 다!

좋은 웹페이지 즐겨찾기