Computer Vision/opencv(python) 70

[40] 2) 자동 이진화: otsu 방법

임계값 자동 결정 방법 Ostu 이진화 방법 입력 영상이 배경(background)과 객체(object) 두 개로 구성되어 있다고 가정 -> Bimodal histogram 임의의 임계값 T에 의해 나눠지는 두 픽셀 분포 그룹의 분산이 최소가 되는 T를 선택 일종의 최적화 알고리즘 (optimization algorithm) Otsu 방법을 이용한 자동 이진화 import sys import numpy as np import cv2 src = cv2.imread('rice.png', cv2.IMREAD_GRAYSCALE) if src is None: print('Image load failed!') sys.exit() th,dst=cv2.threshold(src,0,255,cv2.THRESH_BINARY..

[39] 7.이진 영상 처리 1) 영상의 이진화

영상의 이진화(Binarization)란? 영상의 픽셀 값을 0 또는 255(1) 로 만드는 연산 배경(background) vs 객체(object) 관심 영역 vs 비관심 영역 그레이스케일 영상의 이진화 임계값 함수 cv2.threshold(src,thresh,maxval,type,dst=None) -> retval,dst • src : 입력 영상 . 다채널 , 8 비트 또는 32 비트 실수형 • thresh: 사용자 지정 임계값 • maxval : cv2.THRESH_BINARY 또는 cv2.THRESH_BINARY_INV 방법 사용 시 최댓값. 보통 255 로 지정 • type: cv2.THRESH_ 로 시작하는 플래그. 임계값 함수 동작 지정 또는 자동 임계값 결정 방법 지정 • retval: 사..

[38] 5) 허프 변환: 원 검출

허프 변환을 응용하여 원을 검출할 수 있음 속도 향상을 위해 Hough gradient method 사용 입력 영상과 동일한 2차원 평면 공간에서 축적 영상을 생성 에지 픽셀에서 그래디언트 계산 에지 방향에 따라 직선을 그리면서 값을 누적 원의 중심을 먼저 찾고, 적절한 반지름 검출 단점: 여러개의 동심원을 검출 못함 --> 가장 작은 원 하나만 검출됨 허프 변환 원 검출 함수 cv2.HoughCircles(image,method,dp,minDist,circles=None,param1=None,param2=None,minRadius=None,maxRadius=None) -> circles • image: 입력영상. (에지영상이아닌일반영상) • method: OpenCV4.2 이하에서는 cv2.HOUGH_..

[37] 4) 허프 변환: 직선 검출

허프 변환(Hough transform) 직선 검출이란? 2차원 영상 좌표에서의 직선의 방정식을 파라미터(parameter)공간으로 변환하여 직선을 찾는 알고리즘 축적 배열(accumulation array) 직선 성분과 관련된 원소 값을 1씩 증가시키는 배열 직선의 방정식 y=ax+b를 사용할 때의 문제점 y축과 평행한 수직선을 표현하지 못함 -> 극좌표계 직선의 방정식을 사용 허브 변환에 읜한 선분 검출 cv2.HoughLines(image,rho,theta,threshold,line=None,srn=None,stn=None,min_theta=None,max_theta=None) -> lines • image: 입력 에지 영상 • rho: 축적배열에서rho 값의간격. (e.g.) 1.0 -> 1픽셀간..

[36] 3) 캐니 에지 검출

좋은 에지 검출기의 조건 정확한 검출 : 에지가 아닌 점을 에지로 찾거나 또는 에지인데 에지로 찾지 못하는 확률을 최소화 정확한 위치: 실제 에지의 중심을 검출 단일 에지: 하나의 에지는 하나의 점으로 표현 케니 에지 검출 함수 cv2.Canny(image,threshold1,threshold2,edges=None,apertureSize=None,L2gradient=None) -> edges • image: 입력영상 • threshold1:하단임계값 (threshold1 : threshold2 = 1:2 또는 1:3) • threshold2: 상단임계값 • edges: 에지영상 • apertureSize: 소벨연산을위한커널크기. 기본값은3. • L2gradient: True이면L2 norm 사용, Fal..

[35] 2) 그래디언트와 에지 검출

영상의 그래디언트 (gradient) 함수 f(x,y)를 x축과 y축으로 각각 편미분하여 벡터 형태로 표현한 것 실제 영상에서 구한 그래디언트 크기와 방향 그래디언트 크기: 픽셀 값의 차이 정도, 변화량 그래디언트 방향: 픽셀 값이 가장 급격하게 증가하는 방향 2D 벡터의 크기 계산 함수 cv2.magnitude(x,y,magnitude=None) -> magnitude • x: 2D 벡터의x 좌표행렬. 실수형. • y: 2D 벡터의y 좌표행렬. x와같은크기.실수형. • magnitude: 2D 벡터의크기행렬. x와같은크기, 같은타입. 2D 벡터의 방향 계산 함수 cv2.phase(x,y,angle=None,angleInDegrees=None) -> angle • x: 2D 벡터의x 좌표행렬. 실수형. ..

[34] 6. 영상의 특징 추출 1) 영상의 미분과 소벨 펠터

에지 (edge) 영상에서 픽셀의 밝기 값이 급격하게 변하는 부분 일반적으로 배경과 객체, 또는 객체와 객체의 경계 기본적인 에지 검출 방법 영상을 (x,y)변수의 함수로 간주했을 때, 이 함수의 1차 미분 값이 크게 나타나는 부분을 검출 1차 미분의 근사화 (approximation) 다양한 미분 마스크 소벨 필터를 이용한 미분 함수 cv2.Sobel(src,ddepth,dx,dy,dst=None,ksize=None,scale=None,delta=None,borderType=None) -> dst • src: 입력영상 • ddepth: 출력영상데이터타입. -1이면 입력 영상과 같은 데이터 타입을 사용. • dx: x 방향 미분 차수. • dy: y 방향 미분 차수. • dst: 출력 영상(행렬) • k..

[33] 7) 문서 스캐너 구현

문서스캐너 카메라로 촬영한 문서 영상을 똑바로 펴서 저장해주는 프로그램 구현할 기능 마우스로 문서 모서리 선택 & 이동하기 키보드 ENTER키 인식 왜곡된 문서 영상을 직사각형 형태로 똑바로 펴기 (투시 변환) 마우스로 문서 모서리 선택 & 이동하기 마우스 왼쪽 버튼이 눌린 좌표가 네 개의 모서리와 근접해 있는지를 검사 특정 모서리를 선택했다면 마우스 드래그를 검사 마우스 드래그 좌표 이동 & 화면 표시 마우스 왼쪽 버튼이 떼어졌을 때의 좌표를 기록 왜곡된 문서 영상을 직사각형 형태로 똑바로 펴기 (투시 변환) 네 개의 모서리 좌표를 순서대로 srcQuad 배열에 추가 dstQuad 배열에는 미리 정의한 A4용지 크기의 네 모서리 좌표를 저장 (A4 용지 크기: 210x297cm) srcQuad 점들로부..

[32] 6) 리매핑

리매핑 (remapping) 영상의 특정 위치 픽셀을 다른 위치에 재배치하는 일반적은 프로세스 어파인 변환, 투시 변환을 포함한 다양한 변환을 리매핑으로 표현 가능 리매핑 함수 cv2.remap(src,map1,map2,interpolation,dst=None,borderMode=None,borderValue=None) -> dst • src : 입력 영상 • map1: 결과 영상의 (x, y) 좌표가 참조할 입력 영상의 x 좌표 입력 영상과 크기는 같고 타입은 np.float32 인 numpy.ndarray • map2: 결과 영상의 (x, y) 좌표가 참조할 입력 영상의 y 좌표 • interpolation: 보간법 • dst 출력 영상 • borderMode : 가장자리 픽셀 확장 방식 . 기본값은..

[31] 5) 어파인 변환과 투시 변환

어파인 변환 vs 투시 변환 어파인 변환 행렬 구하기 cv2.getAffineTransform(src,dst) -> retval • src : 3 개의 원본 좌표점 . numpy.ndarray . shape=(3,2) ex) np.array([[x1,y1],[x2,y2],[x3,y3]],np.float32) • dst 3: 개의 결과 좌표점 . numpy.ndarray . shape=(3,2) 투시 변환 행렬 구하기 cv2.getPerspectiveTransform(src,dst,solveMethod=None) -> retval • src : 4 개의 원본 좌표점 . numpy.ndarray . shape=(4,2) ex)np.array([[x1,y1],[x2,y2],[x3,y3],[x4,y4]],np...