본문 바로가기

딥러닝(Deep Learning)

허프 변환(Hough Transformation)(Feat. 컴퓨터 비전과 딥러닝 p131) p129처럼 Edge Pixel들이 서로 이웃하지 않고, p131의 그림처럼 서로 이웃하지 않고, 끊겨져 있는 Edge Pixel에 대한 Edge 검출의 가장 기본적인 아이디어는 허프 변환(Hough Transformation)을 통하여 끊겨진 Edge Pixel을 잇는 직선을 만드는 것이다.(Hough Transformation은 직선 뿐 아니라, 어떤 도형으로도 Edge를 검출하게 할 수가 있다. p132참조) 구체적으로 설명을 하면, Edge Map이 만들어 지고 잘 살펴보니, 아래 3개의 문제점이 있었다. 1] 물체를 구성하는 Edge 픽셀이 자잘하게 끊겨져 있었고, 2] 그것들을 완벽하게 잇는 직선이 존재하지가 않았다. 3] y=a*x+b로 하여, Edge 직선을 검출하기에는 기울기(a)와 절편.. 더보기
cv2.findContours() (Feat. 컴퓨터 비전과 딥러닝, P129) 우선 cv2.findContours()의 반환형 중 하나인 contour의 내부 정보에 대한 분석을 먼저 해보자! contour.shape contours 객체는 등고선 좌표를 담고 있는 리스트입니다. 각 등고선은 각각의 좌표들을 포함하는 리스트로 표현됩니다. contours.shape 속성의 첫 번째 값(contours.shape[0])은 등고선의 개수이고, 두 번째 값(countours.shape[1])은 각 등고선에 포함된 좌표의 수 세 번째 값(contours.shape[2])은 좌표가 차원 정보이다. 이 코드에서 contours.shape는 (n, m, 2) 형태의 튜플이다.( 맨 마지막의 2는 contour를 이루는 좌표가 2차원 좌표라는 뜻) 예를 들어, 만약 contours에 두 개의 등고.. 더보기
cv.CHAIN_APPROX_NONE, CHAIN_APPROX_SIMPLE(Feat. findContours() ) cv.CHAIN_APPROX_NONE 등고선(Edge)을 표현할 때 근사화를 하지 않고, 모든 좌표를 포함하여 표현하는 방법입니다. 이 방법을 사용하면 등고선 상의 모든 픽셀 좌표가 유지되며, 등고선(Edge)이 구성되는 모든 픽셀이 포함됩니다. 1로 표시된 모든 좌표를 반환을 한다. cv.CHAIN_APPROX_SIMPLE 등고선(Edge)의 일부 중요한 포인트만을 선택하여 표현하게 되어 메모리 사용을 줄이고 계산 효율성을 높입니다. 예를 들어, 이 등고선(Edge)을 근사화하여 표현하는 좌표 리스트는 [(0,0), (3,3), (3,1), (3,3)]와 같이 등고선을 대표하는 중요한 포인트만을 포함하고 있게 됩니다. (정사각형의 네 개의 꼭지점의 좌표만이 반환된다) https://bkshin.tist.. 더보기
cv.RETR_LIST(Feat. 컴퓨터 비전과 딥러닝 P128) cv.findContours(img,cv.RETR_LIST, ~~) 함수의 두 번재 인자( cv.RETR_LIST ,cv.RETR_EXTERNAL, cv.RETR_CCOMP, cv.RETR_TREE 등 )는 구멍이 있는 경우 바깥쪽 경계선과 그 안에 있는 구멍의 경계선을 계층적으로 찾는 방식을 지정 하는 것이다. 경계선(Contour)를 찾는 방법이란 구체적으로 바깥 경계선과 내부 경계선 간의 부모-자식 관계를 만들 것인가 안 만들 것인 가로 생각해 볼 수가 있다. 만약 계층 구조를 구축하는 cv.RETR_TREE 등을 사용한다면, 등고선 간의 부모-자식 관계가 나타날 것이며, 내부의 사각형이 바깥쪽 테두리를 포함한다는 관계가 표현됩니다. (이때, 내부 사각형이 부모이고, 바깥쪽 사각형이 자식이 된다) .. 더보기
캐니 에지(Canny Edge)(feat. false positive) (컴퓨터 비전과 딥러닝 p 126 부분에 해당) Canny Edge는 지금도 가장 체계적인 에지 검출 이론이라고 인정 받는 알고리즘이다. 캐니 알고리즘은 거짓 긍정(falst positive)를 줄이기 위해 아래와 같은 과정을 거쳐서 에지의 정확도를 높인다. [엣지 추적]을 좀 더 구체적인 예시로 설명하겠습니다. 아래에 간단한 3x3 이미지 행렬을 사용하여 엣지 추적 과정을 설명하겠습니다. 이미지 행렬: [ 50, 100, 150 ] [ 120, 200, 80 ] [ 30, 70, 120 ] 1.그레디언트 계산: 이미지의 각 픽셀에 대한 그레디언트(기울기)를 계산합니다. 가로 방향과 세로 방향의 그레디언트를 계산합니다. 예를 들어, 중앙 픽셀(200)의 가로 그레디언트는 (80 - 120) = -40이고.. 더보기
물체 인식(Object Recongnition) vs 의미 분할(Semantic Segmentation) 1.물체 인식(Object Recognition): 목적: 이미지에서 어떤 물체가 있는지 식별. 작업: 이미지 전체에서 물체의 위치와 클래스를 찾음. 결과: "이 이미지에는 개가 있습니다." 2.의미 분할(Semantic Segmentation): 목적: 이미지를 픽셀 수준에서 세분화하여 각 픽셀에 레이블을 할당하여 의미 있는 영역을 식별. 작업: 이미지 내에서 각 픽셀이 어떤 클래스에 속하는지 식별. 결과: 이미지에서 개의 위치를 정확하게 식별하고, 각 픽셀에 해당하는 레이블을 할당하여 개가 있는 부분을 세분화. 예를 들어, 이미지에서 개의 몸통, 귀, 꼬리 등이 어디에 있는지 구분. 예를 들어, 아래와 같은 이미지가 있다고 가정해봅시다. 물체 인식 결과: "이 이미지에는 개가 있습니다." 의미 분할 .. 더보기
cv2.cvtColor(grayscale 변환)의 내부 원리(feat. Luma) Grayscale 이미지로의 변환은 BGR 이미지의 각 픽셀을 단일 휘도(밝기) 값으로 변환하는 과정입니다. 일반적으로 많이 사용되는 방법 중 하나는 휴먼 비전(Human Vision)에 기반한 방법인 Luma 채널을 사용하는 것입니다. Luma는 B, G, R 채널의 가중 평균을 계산하여 얻을 수 있습니다. Luma 계산식: GrayScale=0.299⋅R + 0.587⋅G + 0.114⋅B import cv2 # 이미지 읽기 image = cv2.imread('example.jpg') # BGR 이미지를 Grayscale 이미지로 변환 gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) Opencv-Python에서는 일반적으로 cv2.cvtColor()을 사.. 더보기
png 파일과 jpg(jpeg) 파일의 차이점(feat. Alpha 채널) PNG 파일은 투명도(알파 채널)를 지원하기 위해 4개의 채널(RGBA)을 사용합니다. 각각의 채널은 이미지의 색상 정보를 나타냅니다. 빨강 채널 (Red): 이미지에서 빨강색을 나타냅니다. 초록 채널 (Green): 이미지에서 초록색을 나타냅니다. 파랑 채널 (Blue): 이미지에서 파란색을 나타냅니다. 알파 채널 (Alpha): 이 채널은 각 픽셀의 투명도를 나타냅니다. 0은 완전한 투명을, 255는 완전한 불투명을 나타냅니다. 이 알파 채널을 사용하면 이미지에서 일부 영역을 투명하게 처리할 수 있습니다. 투명도를 지원하는 것은 PNG 파일이 배경이 없는 이미지나 이미지의 특정 부분을 다른 이미지와 결합할 때 유용합니다. 예를 들어, 로고 이미지를 PNG로 저장하면 배경이 투명한 로고를 얻을 수 있습.. 더보기