0

이 이미지에 find_contour (opencv 모듈)을 적용하면 5 개의 객체 (기호 당 하나) 만 얻을 수 있습니다 : https://docs.google.com/file/d/0ByS6Z5WRz-h2WHEzNnJucDlRR2s/edit? 이제 64 개의 객체를 얻습니다.find_contour를 통해 부호 당 1 등고선을 얻고 cv2에서 Humoments를 검색하십시오.

그런 다음 다른 이미지와 비교해 보겠습니다. 지금은 같은 이미지를 조금 번역 해 보았습니다. 테스트 해보니 똑같습니다.

내 질문 나는 humoments를 적용하기 위해 단지 5 개의 물체만을 얻을 수 있습니까? 아니면 humoments를 계산할 다른 솔루션이 있을까요?

import cv2 
im = cv2.imread('Sassatelli 1984 n. 165 mod1.jpg') 
imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY) 
blur = cv2.GaussianBlur(imgray, (0,0), 5) 
cv2.imshow('Blur', blur) 
cv2.waitKey() 
th = 20 
edges = cv2.Canny(blur, th, th*3) 
cv2.imshow('canny',edges) 
cv2.waitKey() 
contours, hierarchy = cv2.findContours(edges, cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) 
print('objects found') 
print(len(contours)) 
cnt = contours[0] 
cv2.drawContours(blur,contours,-1,(0,255,0),3) 
cv2.imshow('draw contours',blur) 
cv2.waitKey() 
moments = cv2.moments(cnt) 

답변

2

케이스 1, 손실 압축에서는 흑백 전용 (즉, 화소 값을 0과 255 만) JPG 형식으로 이미지를 저장할 때 JPG 형식 에 이미지를 저장에 문제가있다, 픽셀 값이 변경됩니다. 사진을보고 싶으면 그런 이미지를 만들고 jpg로 저장 한 다음 저장된 이미지를 열고 흑백 가장자리로 확대하십시오. 픽셀 값 변경을 볼 수 있습니다.

등고선을 찾을 때 흰색 물체 만있을 것으로 예상되지만 실제로는 중간 값도 있으며 윤곽선으로 간주됩니다. 그것은 등고선의 수를 증가시킵니다.

그래서

이 문제를 방지하는 등

  • PNG 또는 다른 무손실 형식으로 이미지를 저장
    • 더 나은 것은 (127의 값으로 또는 당신이 원하는대로) 이미지가 실제 만드는 임계 값을 적용 등고선을 찾기 전에 이진 1.

    이 훨씬 더 여기 설명 : What does result of 'list(contour)' denote?

    사례 2 : 문제를 흰색 배경

    에서 OpenCV findcontours()가 검은 색 배경에 흰색 물체를 찾을 수 있도록 설계되었습니다. 따라서 배경이 흰색 인 경우 하나의 개체로 취급됩니다. 윤곽을 찾기 전에 이미지를 뒤집습니다.

    사례 3 : 객체

    당신이 당신의 객체에 구멍이있는 경우에 구멍이있는 문제는, 그것은 또한 객체로 간주됩니다. 따라서 객체의 외부 경계 만 원하면 findcontours() 함수에 cv2.RETR_EXTERNAL 플래그를 사용하십시오.

    샘플 코드 :

    import cv2 
    import numpy as np 
    img = cv2.imread('sof.jpg') 
    gray = cv2.imread('sof.jpg',0) 
    ret,thresh = cv2.threshold(gray,127,255,cv2.THRESH_BINARY_INV) 
    

    된 임계과 반전 이미지 :

    이제

    enter image description here

    이 그것을 그릴, 윤곽을 찾을 윤곽의 수 확인 :

    cv2.drawContours(img,contours,-1,(0,255,0),2) 
    cv2.imshow('img',img),cv2.waitKey(0),cv2.destroyAllWindows() 
    

    결과 :

    enter image description here

    참고 : 여기에

    가, 난 단지 외부 윤곽 촬영했다. 이러한 객체에서 내부 구멍을 제거하려면 cv2.RETR_TREE 또는 cv2.RETR_CCOMP 플래그를 사용하여 계층 구조를 확인하고 제거해야합니다. 이 링크에서 설명됩니다 : Contours 5 : Hierarchy

  • +0

    답장을 보내 주셔서 감사합니다! 나는이 다른 3 이미지 png 형식으로 변환 된 시도하고 몇 가지 문제가 있습니다. 큰 원이있는 이미지는 2 개의 윤곽선 만 가져옵니다 (RETR_EXTERNAL을 선택했기 때문에 생각합니다). Veio 이미지 89 윤곽선과 마지막 16 윤곽선. https://docs.google.com/file/d/0ByS6Z5WRz-h2V2w4SFNXcVI5WFU/edit https://docs.google.com/file/d/0ByS6Z5WRz-h2cE1wTGJwRnE5YUU/edit https://docs.google.com/file/ d/0ByS6Z5WRz-h2bW9XTHU2TEtWSDA/edit – postgres

    +0

    제 질문은이 경우에도 적응을 할 수 있는지 (많은 사진이 있습니다) 아니면 모든 이미지를 다른 방식으로 분석해야하는지입니다. 나는 당신에게 말했다. 왜냐하면 나는이 징후들을 비교하고 싶다. – postgres

    +0

    이 이미지를 잊어 버렸습니다 : https://docs.google.com/file/d/0ByS6Z5WRz-h2UTFCaVEzaHlXRVk/edit. 36 개의 물체를 찾았고, 그래서 중요도가없는 작은 점들 (노이즈)을 발견했다고 생각합니다! – postgres