본문 바로가기

Image Processing13

[OpenCV] 기하학(Geometry) -Rotation, Scaling, Translation, interpolation 기하학(Geometry) 처리 기하학은 점, 선, 면, 도형 등의 기하학적인 대상을 다루는 학문이다. 즉, 대상의 길이, 넓이 각도 등을 측정하거나 공간상의 특성을 연구하는 수학의 한 분야이다 기하학의 영어 단어 'Geometry' 는 토지를 뜻하는 geo와 측량을 뜻하는 metry라는 단어가 합해져서 만들어진 용어이다 영상처리에서 기하학 처리는 영상 내에 있는 기하학적인 대상의 공간적 배치를 변경하는 과정을 말한다. 이것을 화소의 입장에서 보면, 영상을 구성하는 화소들의 공간적 위치를 재배치하는 과정이라고 할 수 있다. 이러한 변화에는 크게 외정, 크기 변경, 평행이동등이 있다. 보통 영상처리 관련 논문에서는 이 세가지 변환을 일커러 RST 변환이라고 말한다. R은 Rotation, S는 Scaling.. 2022. 11. 27.
[OpenCV] 모폴로지 (morphology) 모폴로지(morphology) 모폴로지는 형태학이라는 뜻으로 다양한 학문 분야에서 사용되는 용어이다 영상처리에서는 모폴로지는 영상의 객체들의 형태 (shape)를 분석하고 처리하는 기법이다. 이 형태학적 처리를 활용하여 영상의 경계, 골격, 블록 등의 형태를 표현하는데 필요한 요소를 추출한다. 간단히 말하면, 영상 내에 존재하는 객체의 형태를 조금씩 변형시킴으로써 영상 내에서 불필요한 잡음을 제거하거나 객체를 두드러지게 하여 필요한 요소를 추출한다 침식 연산 (erosion operation) 침식 연산은 객체를 침식시키는 연산이다. 따라서 객체의 크기가 축소되고, 배경은 확장된다 객체의 크기가 축소되기 때문에 영상 내에 존재하는 잡은 같은 작은 크기의 객체들은 사라질 수 있다 이러한 연산을 이용하여 소.. 2022. 11. 25.
[OpenCV] 필터링 (Filtering) 최댓값/최솟값 필터링 입력 영상의 줌심 화소에서 마스크로 씌워진 영역의 입력 화소들을 가져와 계수를 구성하고 그중에서 최댓값과 최솟값을 출력 화소로 결정하는 방법이다. 측, 최댓값 필터링은 게수중에서 최대값을 통과시켜 출력 화소가 되고, 최솟값 필터링은 최솟값을 통과시켜 출력 화소가 된다. import numpy as np, cv2 def minmax_filter(image, ksize, mode): rows, cols = image.shape[:2] dst = np.zeros((rows, cols), np.uint8) center = ksize // 2 # 마스크 절반 크기 for i in range(center, rows - center): # 입력 영상 순회 for j in range(center,.. 2022. 11. 25.
[OpenCV] 에지 검출 로버트(Roberts) 마스크 로버트 마스크는 대각선 반향으로 1과 -1을 배치하여 구성되며, 나머지 원소의 값이 모두 0이어서 다른 1차 미분 마스크에 비해서 계산이 단순하다. 그리고 한 번만 차분을 게산하기 때문에 차분의 크기가 작고, 이로 인해서 경계가 확실한 에지만 추출하며, 잡음에 매우 민감하다 import numpy as np, cv2 # 회선 수행 함수 - 행렬 처리 방식 def filter(image, mask): rows, cols = image.shape[:2] dst = np.zeros((rows, cols), np.float32) # 회선 결과 저장 행렬 xcenter, ycenter = mask.shape[1]//2, mask.shape[0]//2 # 마스크 중심 좌표 for i .. 2022. 11. 25.
[OpenCV] 블러링과 샤프닝 블러링 블러링은 영상에서 화소값이 급격하게 변하는 부분들을 감소시켜 점진적으로 변하게 함으로써 영상에서 전체적으로 부드러운 느낌이 나게 하는 기술이다. 교재에 따라서 스무딩(smoothing)이라 하기도 한다 import numpy as np, cv2 # 회선 수행 함수 - 행렬 처리 방식(속도 면에서 유리) def filter(image, mask): rows, cols = image.shape[:2] dst = np.zeros((rows, cols), np.float32) # 회선 결과 저장 행렬 xcenter, ycenter = mask.shape[1]//2, mask.shape[0]//2 # 마스크 중심 좌표 for i in range(ycenter, rows - ycenter): # 입력 행렬 .. 2022. 11. 24.
[OpenCV] 03. 화소처리 (컬러 공간 변환) 컬러 공간 변환 (BGR -> CMY) import numpy as np, cv2 BGR_img = cv2.imread("img/color_model.jpg", cv2.IMREAD_COLOR) # 컬러 영상 읽기 if BGR_img is None: raise Exception("영상 파일 읽기 오류") white = np.array([255, 255, 255], np.uint8) CMY_img = white - BGR_img Cyan, Magenta, Yellow = cv2.split(CMY_img) # 채널 분리 titles = ['BGR_img','CMY_img','Cyan','Magenta','Yellow'] [cv2.imshow(t, eval(t)) for t in titles] cv2.waitK.. 2022. 11. 23.
[OpenCV] 02. 화소처리 (히스토그램) 영상 히스토그램 계산 - 1 import numpy as np, cv2 def calc_histo(image, channels, hsize, ranges ): ch = len(channels) shape = hsize if ch >1 else (hsize[0], 1) hist = np.zeros(shape, np.float32) # 히스토그램 누적 행렬 gap = np.divide(ranges[1::2], hsize) # 계급 간격 for row in image: # 2차원 행렬 순회 방식 for val in row: idx = np.divide(val[channels], gap).astype('uint') hist[tuple(idx)]+= 1 return hist image = cv2.imread("i.. 2022. 11. 23.
[OpenCV] 01. 화소 처리 행렬 원소 접근 방법 import numpy as np def mat_access1(mat): for i in range(mat.shape[0]): for j in range(mat.shape[1]): k = mat[i, j] # 원소 접근 - mat1[i][j] 방식도 가능 mat[i, j] = k * 2 # 원소 할당 def mat_access2(mat): for i in range(mat.shape[0]): for j in range(mat.shape[1]): k = mat.item(i, j) # 원소 접근 mat.itemset((i, j), k * 2) # 원소 할당 mat1 = np.arange(10).reshape(2, 5) mat2 = np.arange(10).reshape(2, 5) pri.. 2022. 11. 22.
[OpenCV] 산출 연산 함수 산출 연산 함수 cv2.add(src1, src2[, dst[, mask[, dtype]]]) : 두 개의 배열 혹은 배열과 스칼라의 각 원소 간 합을 계산 src1 : 첫 번째 입력 배열 혹은 스칼라 src2 : 두 번째 입력 배열 혹은 스칼라 dst : 계산된 결과의 출력 배열 mask : 연산 마스크 : 0이 아닌 마스크 원소의 위치만 연산 수행(8비트 단일 채널) dtype : 출력 배열의 깊이 cv2.subtract(src1, src2[, dst[, mask[, dtype]]]) : 두 개의 배열 혹은 배열과 스칼라의 각 원소 간 차분을 계산한다. add() 함수와 인수 동일 cv2.multiply(src1, src2[, dst[, scale[, dtype]]]) : 두 배열의 각 원소 간 곱을.. 2022. 11. 21.