k- 최근접 이웃 알고리즘, k-Nearest Neighbour (KNN)에 대해서 설명합니다. 마지막 업데이트 2019. 2. 9 KNN은 지도학습(supervised learning)을 위해 사용할 수 있는 간단한 분류(classification) 알고리즘 중 하나입니다. 새로운 데이터가 주어질 때 기존 클래스중 어느 쪽에 속할지 결정합니다. 파란색 사각형과 빨간색 삼각형 두가지 클래스의 데이터가 존재할 때, 초록색 원이 추가되었습니다. 초록색 원은 파란색 사각형과 빨간색 삼각형 중 어느 쪽에 포함시켜야 할까요? 초록색 원과 거리가 가까운 이웃을 찾아서 해당 클래스에 초록색 원을 추가할 수 있습니다. 여기에서는 빨간색 삼각형 클래스입니다. 이 방법을 최근접 이웃 알고리즘(Nearest Neighbou..
imwrite 함수로 저장하면 바이너리 이미지라도 그레이스케일(8비트 1채널) 이미지로 저장됩니다. imwrite 사용시 IMWRITE_PNG_BILEVEL 옵션을 추가해주면 1비트 1채널 이미지로 저장할 수 있습니다. 1비트 이기 때문에 0과 1 두가지만 표현가능합니다. png 확장자를 가지는 이미지만 가능합니다. 다음은 Python과 C++구현한 코드입니다. Python import cv2 as cv img_color = cv.imread('test.png', cv.IMREAD_COLOR) img_gray = cv.cvtColor(img_color, cv.COLOR_BGR2GRAY) ret, img_binary = cv.threshold(img_gray, 150, 255, cv.THRESH_BINAR..
이미지에서 코너 검출시 사용하는 해리스 코너에 대해 알아봅니다. Harris Corner Detector 구현 코드입니다. import cv2 as cv import numpy as np import time img_color = cv.imread('chessboard.jpg', cv.IMREAD_COLOR) img_gray = cv.cvtColor(img_color, cv.COLOR_BGR2GRAY) img_sobel_x = cv.Sobel(img_gray, cv.CV_32F, 1, 0) img_sobel_y = cv.Sobel(img_gray, cv.CV_32F, 0, 1) IxIx = img_sobel_x * img_sobel_x IyIy = img_sobel_y * img_sobel_y IxIy ..
Watershed 알고리즘을 사용하여 영상 분할(Image segmentation) 하는 방법에 대해 설명합니다. 다음 OpenCV Python 튜토리얼을 참고하여 강좌를 비정기적로 포스팅하고 있습니다. https://docs.opencv.org/4.0.1/d6/d00/tutorial_py_root.html 그레이스케일 이미지에서 높은 픽셀값을 가지는 부분을 언덕으로 보고, 낮은 픽셀값을 가지는 부분을 계곡으로 볼 수 있습니다. 한 이미지에 여러 개의 고립된 계곡(극소점)이 있을 수 있습니다. 각각 다른 색의 물(라벨)로 물을 채운다고 합시다. 수위가 상승함에 따라 다른색의 물로 채워지던 계곡들이 하나로 합쳐질 수 있습니다. 이것을 방지하기 위해 물이 합류되는 지점에 벽을 쌓습니다. 모든 언덕이 물에 잠..
거리 변환(Distance Transform)은 바이너리 이미지(Binary Image)에서 픽셀값이 0인 배경으로부터의 거리를 픽셀값이 255인 영역에 표현하는 방법입니다. 배경으로부터 멀리 떨어져 있을 수록 높은 픽셀 값을 가집니다. 실제 실행 결과입니다. 직사각형의 경우 배경으로부터 일정거리 떨어진 영역인 중앙에 일직선으로 밝은 부분이 생깁니다. cv.distanceTransform 함수의 결과를 문자열로 출력해보아도 대각선으로 밝은 부분이 높은 값을 갖지 않아서 이상합니다. 원의 경우 중앙으로 갈수록 픽셀값이 높아지기 때문에 중앙이 흰색입니다. 테스트에 사용한 코드입니다. import cv2 as cv import numpy as np img = cv.imread('rectangle.jpg') g..
이번 포스팅에서는 템플릿 매칭을 사용하여 이미지상에서 오브젝트를 찾는 방법을 다룹니다. 다음 OpenCV Python 튜토리얼을 참고하여 강좌를 비정기적로 포스팅하고 있습니다. https://docs.opencv.org/4.0.1/d6/d00/tutorial_py_root.html 템플릿 매칭 구현은 다음 링크를 참고하세요. OpenCV 강좌 - 템플릿 매칭(Template Matching) 구현https://webnautes.tistory.com/1349 마지막 업데이트 2019. 1. 3 템플릿 매칭은 입력 이미지에서 템플릿 이미지의 위치를 찾는 방법입니다. OpenCV에서는 템플릿 매칭을 위해 cv.matchTemplate() 함수를 제공합니다. 2차원 컨볼루션처럼 템플릿 이미지를 입력 이미지상 위..
Hough Line Transform 구현 원리에 대해서 다룹니다. 유튜브에서 사용한 코드입니다. import cv2 as cv import numpy as np import math import time img_original = cv.imread('square.jpg', cv.IMREAD_COLOR) img_gray = cv.cvtColor(img_original, cv.COLOR_BGR2GRAY) img_edge = cv.GaussianBlur(img_gray, (5, 5), 0, 0) img_edge = cv.Canny(img_edge, 50, 150, 3) height = img_edge.shape[0] width = img_edge.shape[1] tmp = min(height, width) ..
깃허브에 공개되어 있는 파이썬 기반 얼굴 인식 라이브러리를 테스트해보았습니다. 1. dlib를 설치합니다.(시간이 오래 걸립니다.)pip3 install dlib 2. Face Recognition 라이브러리를 설치합니다. pip3 install face_recognition 3. OpenCV를 설치합니다. pip3 install opencv-contrib-python 4. 아래 주소에 있는 코드를 가져옵니다. https://github.com/ageitgey/face_recognition/blob/master/examples/facerec_from_webcam_faster.py 5. 인식할 얼굴 사진과 이름을 변경해줍니다. 오바마 이미지를 스마트폰으로 촬영후 얼굴만 잘라낸 사진으로 변경했습니다. 인식할..
PyOpenGL과 GLFW를 사용하여 사각형을 그려보는 Modern OpenGL 예제입니다. 다음 깃허브의 코드를 바탕으로 강좌를 진행하고 있습니다. https://github.com/totex/PyOpenGL_tutorials Python으로 배우는 Modern OpenGL - 1. 개발환경 만들기https://webnautes.tistory.com/1271 Python으로 배우는 Modern OpenGL - 2. 삼각형 그리기(Vertex Buffer Object)https://webnautes.tistory.com/1272 이전 포스팅과 겹치는 부분을 제외하고 설명합니다. 사각형을 그리려면 삼각형을 2번 그려야 합니다. 그러면 같은 버텍스를 두 번 정의해야 하는 문제가 생깁니다. 복잡한 모델을 이 ..
PyOpenGL과 GLFW를 사용하여 삼각형을 그려보는 Modern OpenGL 예제입니다. 다음 깃허브의 코드를 바탕으로 강좌를 진행하고 있습니다. https://github.com/totex/PyOpenGL_tutorials Python으로 배우는 Modern OpenGL - 1. 개발환경 만들기https://webnautes.tistory.com/1271 1. GLFW를 초기화합니다. if not glfw.init(): return 2. 크기 800 x 600의 윈도우를 생성합니다. 생성시 문제가 발생하면 GLFW를 사용해 생성한 윈도우와 context 관련 자원을 해제합니다. window = glfw.create_window(800, 600, "My OpenGL window", None, None..