글

라벨이 imageprocessing인 게시물 표시

numpy.einsum을 이용한 빠른 2d convolution 연산 (conv2d)예제 코드

이미지
 본 포스트는 numpy.einsum을 사용하여 2차원 합성곱 연산을 수행하는 예제 코드를 싣고 있다. 단순 연산을 사용한 2차원 합성곱 단순히 for loop를 사용하여 아래처럼 2차원 합성곱 연산을 수행할 수 있다. import numpy as np def conv2d(image, kernel):     kernel = np.flipud(np.fliplr(kernel)) #XCorrel     output = np.zeros(np.subtract(image.shape, kernel.shape))          for y in range(output.shape[1]):         for x in range(output.shape[0]):             output[x, y] = (kernel * image[x: x + kernel.shape[0], y: y + kernel.shape[1]]).sum()     return output 하지만, 위 경우 image의 크기가 커지면 연산양이 많아져 수행 속도가 느려지게 된다.  numpy.einsum을 사용한 2차원 합성곱  빠른 속도의 합성곱 연산을 원한다면, numpy.lib.stride_tricks.as_strided와 numpy.einsum을 사용하면 빠른 속도로 2차원 함성곱 연산을 수행할 수 있다. import numpy as np def conv2d_np(image, kernel):     kernel = np.flipud(np.fliplr(kernel)) #XCorrel        ...

OpenCV를 사용한 간단한 차선 인식 예제

이미지
본 포스트에는 OpenCV에서 제공하는 이미지 프로세싱 API들을 사용한 차선 인식하는 Python 예제 코드를 싣고 있다.  차선인식은 허프 변환(Hough Transform) 을 사용하여 도로의 차선을 구분하도록 하였다. 차선 인식을 위해 다음과 같은 이미지 처리과정이 필요하다.  - 이미지 컬러를 흑백으로 변환 - 노이즈를 제거하기 위한 blurring - 이미지에서 경계면 검출 - 허프 변환을 통해 이미지에서 선 위치 검출 - 검출된 선 위치데이터를 사용해 차선 필터링 차선 필터링은 간단하게 검출된 선의 각도만을 계산하여 필터링 하였다. 예제 코드는 다음과 같다. import math import cv2 as cv def LaneFiltering(lines):          if lines is None:         return None          Lanes = []          for i in range(0,len(lines)):         l = lines[i][0]         x1,y1,x2,y2 = l[0],l[1],l[2],l[3]         if x1 == x2:             Lanes.append([x1,y1,x2,y2])             continue         angle = math.atan((y2-y1)/(x2-x1))*180/mat...

이미지의 가장자리 경계면 검출 (edge detection) 원리와 예제

이미지
 2차원 이미지의 경계면을 찾는 원리는 다음과 같다.    이미지의 경계면은 보통 위 그림의 a와 같이 색의 차이가 있는 것을 볼 수 있으며, 1차원으로 보면 그림의 b처럼 나타낼 수 있다. 이 색의 차이가 많아지는 부분은 미분을 통해(그림의 c) 찾을 수 있다. 미분연산은 합성곱(convolution) 연산을 사용하여 근사치를 계산할 수 있다. 예를 들어 아래와 같이 2개의 gx, gy matrix를 사용해 2d 이미지에서 미분 값이 큰 위치를 찾을 수 있다. 즉 이미지의 경계면을 찾을 수 있다.  def main():     gx = np.array([(-1,0,1),                    (-2,0,2),                    (-1,0,1)])     gy = np.array([(-1,-2,1),                    (0,0,0),                    (1,2,1)])     src = np.array([(125,255,255,255,255,255),                     (000,125,255,255,255,255),                     ...

이미지 blur와 양방향 필터링(Bilateral Filtering)

이미지
노이즈를 줄이거나 이미지를 부드럽게 보이기 위해 blurring을 사용한다.  일반적으로 커널 윈도우를 이미지 전체에서 슬라이딩하여 필터링하며 blurring한다.    많이 사용되는 필터(커널)의 형태는 다음과 같다. 1. 커널 영역 픽셀의 평균값을 사용 2. 커널 영역 픽셀의 가우스 분포 가중 평균을 사용 3. 커널 영역 픽셀의 중앙값을 사용 import cv2 as cv # https://docs.opencv.org/master/d4/d86/group__imgproc__filter.html#ga8c45db9afe636703801b0b2e440fce37 def Blur(img, ksize=(1,1), title='Blur'):     if img is None:         return     dst = cv.blur(img,ksize)     cv.imshow(title,dst) # https://docs.opencv.org/master/d4/d86/group__imgproc__filter.html#gaabe8c836e97159a9193fb0b11ac52cf1 def GaussianBlur(img, ksize=(1,1), title='GaussianBlur'):     if img is None:         return     dst = cv.GaussianBlur(img,ksize,0)     cv.imshow(title,dst) # https://docs.opencv.org/master/d4/d86/group__imgproc__filter.html#ga564869aa33e58769b4469101aac458f...

Python OpenCV를 사용한 간단한 얼굴 위치 인식 예제 코드

이미지
 Face ID와 같은 보안이나, SNOW 같은 카메라 app에서 얼굴을 변형하거나 이미지를 보정하는 분야까지 얼굴 인식은 현재 많은 분야에 사용되고 있다. 본 포스트는 Python에서 OpenCV를 사용하여 얼굴의 위치를 감지하고, 그 위에 다른 이미지를 그리는 예제를 담고 있다.  OpenCV 튜토리얼 중 카메라 haar cascade classifier를 사용해 영상에서 사람의 얼굴 위치를 감지하는 예제가 있다.  https://docs.opencv.org/master/db/d28/tutorial_cascade_classifier.html  Haar feature-based cascade classifier를 사용한 객체 감지는 Paul Viola와 Michael Jones의 논문 “Rapid Object Detection using a Boosted Cascade of Simple Features”에서 제안한 객체 감지 방법이라고 한다. 이는 검출하고자 하는 객체 이미지와 그 객체가 없는 이미지를 훈련시킨 후 다른 이미지에서 원하는 객체를 감지하는 일종의 머신 러닝의 방식이라고 한다. OpenCV를 사용하여 얼굴 위치를 인식하는 순서는 다음과 같다.  1. cv.CascadeClassifier를 사용하여 cascade classifier를 생성한다. 2. cv.CascadeClassifier.load를 사용하여 훈련된 모델의 xml파일을 로드 한다. 3. Cv.CascadeClassifier.detectMultiScale을 사용하여 이미지에서 얼굴의 위치를 감지한다. 객체 검출 모델은 훈련을 통해 만들 수 있다. ( https://docs.opencv.org/master/dc/d88/tutorial_traincascade.html ) OpencCV에서는 이미 학습된 얼굴 감지 모델을 제공하고 있고,...

Python OpenCV를 사용하여 동영상에서 움직이는 물체 검출 예제

이미지
 본 포스트에서는 background subtraction을 사용하여 동영상에서 움직이는 물체를 검출하는 예제를 싣고 있다. 배경 제거 (background subtraction)의 원리는 아래 포스트를 참조하자. 신호에서 배경 제거(background subtraction)를 통한 움직이는 물체의 위치 검출 OpenCV에는 Background Subtractor가 구현되어 있으므로 이를 사용하였다. https://docs.opencv.org/3.4/de/de1/group__video__motion.html 코드는 아래와 같다. import cv2 as cv import numpy as np def main():          cap = cv.VideoCapture('20201110_113359.mp4')          bgs = cv.createBackgroundSubtractorKNN(dist2Threshold =500,detectShadows=False)          while cap.isOpened():         ret, frame = cap.read()                  if not ret:             break                  frame = cv.resize(frame,None,fx=0.2,fy=0.2,interpolation = cv.INTER_CUBIC) ...

Python opencv 설치와 이미지 출력 및 카메라 영상 캡쳐 예제 코드

이미지
◼ python환경 opencv 설치 anaconda conda install -c conda-forge opencv https://anaconda.org/conda-forge/opencv pip pip install opencv-python 설치 버전 확인 import cv2 as cv print(cv.__version__) 4.1.0 ◼ opencv 동작 예제 코드 OpenCV-Python Tutorials 페이지에 python에서 opencv를 사용하는 예제 코드들이 수록되어 있다. 위 예제 중 간단한 몇 가지를 실행해 봤다. 이미지 디스플레이 예제 참조 :  https://docs.opencv.org/master/db/deb/tutorial_display_image.html import cv2 as cv img = cv.imread('14793554227.jpg') if img is not None:     cv.imshow('display', img) cv.waitKey(0) cv.destroyAllWindows() 카메라 영상 캡쳐 예제 참조 :  https://docs.opencv.org/master/dd/d43/tutorial_py_video_display.html import cv2 as cv cap = cv.VideoCapture(0) while cap.isOpened():     # Capture frame-by-frame     ret, frame = cap.read()     # if frame is read correctly ret is True     if not ret:         print("Can't ...