[Robotics] 4. 고전 CV & Image Processing 이론 정리

김성윤(Jack)·2026년 6월 22일

Robotics

목록 보기
4/6

0. 전체 내용 요약과 키워드

이 문서는 딥러닝 이전의 컴퓨터비전 기초를 이미지의 수치적 표현과 규칙 기반 처리 관점에서 정리한다. 이미지는 픽셀 배열이며, grayscale/RGB, histogram, contrast, noise, edge, region 같은 신호 특성을 이해해야 이후 detection과 segmentation 결과도 해석할 수 있다.

전처리, filtering, convolution, edge detection, thresholding, segmentation, morphology는 영상에서 의미 있는 구조를 드러내기 위한 단계다. Feature matching과 homography는 서로 다른 이미지 사이의 대응 관계와 기하 변환을 다루며, PCA/eigen image는 고차원 이미지 데이터를 낮은 차원 특징으로 해석하는 흐름을 보여 준다. 로봇에서는 이 개념들이 작업 영역 분리, 물체 후보 추출, 위치 추정, 시각 디버깅의 기반이 된다.

키워드: image representation, pixel, grayscale, RGB, histogram, histogram equalization, CLAHE, masking, ROI, filtering, convolution, blur, sharpening, edge detection, thresholding, segmentation, morphology, erosion, dilation, feature extraction, keypoint, descriptor, matching, homography, PCA, eigen image

1. 이미지 표현과 전처리

1.1. 이미지 표현과 기본 전처리

1.1.1. 학습 목적

컴퓨터비전에서 이미지는 픽셀 값의 배열이다. 사람은 이미지를 장면으로 보지만, 알고리즘은 픽셀 값, 채널, 밝기 분포, 경계, 질감, 노이즈를 본다. 따라서 CV의 출발점은 이미지를 어떻게 수치 데이터로 이해하고, 이후 알고리즘이 보기 좋은 형태로 바꾸는지 익히는 것이다.

전처리는 단순히 이미지를 예쁘게 만드는 과정이 아니다. Thresholding, segmentation, feature extraction, CNN, detection이 잘 작동하도록 입력 신호를 정리하는 과정이다. 조명, 대비, 노이즈, 크기, 색상 분포가 달라지면 같은 알고리즘도 전혀 다른 결과를 낼 수 있다.

1.1.2. Grayscale, RGB, Histogram

Grayscale 이미지는 각 픽셀이 하나의 밝기 값을 가진다. RGB 이미지는 red, green, blue 세 채널을 가진다. 알고리즘에 따라 grayscale로 변환해 밝기 구조만 보기도 하고, RGB나 HSV 같은 색 공간에서 색 정보를 활용하기도 한다.

Histogram은 이미지의 픽셀 값 분포를 보여 준다. 어두운 이미지는 낮은 픽셀 값에 몰려 있고, 대비가 낮은 이미지는 좁은 범위에 값이 집중된다. Histogram을 보면 thresholding이 쉬울지, contrast enhancement가 필요한지 판단할 수 있다.

1.1.3. Histogram Equalization과 CLAHE

Histogram equalization은 픽셀 값 분포를 넓혀 대비를 높이는 방법이다. 어두운 영역과 밝은 영역의 차이를 키워 segmentation이나 edge detection이 더 잘 보이도록 만들 수 있다. 하지만 전체 이미지에 동일하게 적용하면 특정 영역에서 과도한 대비 증가나 노이즈 강조가 생길 수 있다.

CLAHE는 Contrast Limited Adaptive Histogram Equalization이다. 이미지를 작은 영역으로 나누고, 각 영역에서 대비를 향상시키되 clip limit을 둬 과도한 증폭을 줄인다. 의료 영상이나 조명 차가 큰 이미지에서 유용하다.

이 결과 이미지는 histogram equalization을 통해 전체 대비가 바뀐 모습을 보여 준다. 핵심은 밝기 값을 재분배해 어두운 영역의 구조를 더 잘 드러내는 것이다.

CLAHE 비율별 결과 이미지는 clip limit이나 보정 강도가 달라질 때 영상의 대비와 노이즈가 어떻게 바뀌는지 보여 준다. 비율이 낮으면 변화가 약하고, 강하게 적용하면 구조는 더 도드라지지만 노이즈나 인위적 대비가 커질 수 있다.

1.1.4. Masking과 ROI

Mask는 이미지에서 관심 영역만 남기고 나머지를 제외하는 방법이다. 객체가 있는 영역만 처리하거나, 특정 색상/밝기 범위만 선택할 때 사용한다. ROI는 Region of Interest로, 전체 이미지가 아니라 필요한 부분만 잘라 처리하는 방식이다.

실습 이미지에는 mask와 PCB crop/translation/defect 이미지가 포함되어 있다. 이는 전체 이미지에서 관심 영역을 추출하고, 위치 변화나 결함을 비교하는 흐름을 보여 준다.

PCB 예제는 이미지 정렬, 결함 비교, 관심 영역 추출이 전처리와 연결된다는 점을 보여 준다. 같은 대상이라도 위치가 조금 바뀌면 픽셀 단위 비교가 어려워지므로 crop, translation, alignment 같은 처리가 필요하다.

1.1.5. 이미지 전처리 실습 정리

  • 실습에서 이해할 점

전처리는 이후 단계의 성능을 결정한다. Contrast가 낮으면 thresholding이 어려워지고, noise가 많으면 edge와 작은 객체가 잘못 검출된다. 반대로 전처리를 과하게 적용하면 원래 구조가 왜곡될 수 있다.

따라서 전처리는 “무조건 좋은 이미지”를 만드는 것이 아니라, 뒤에서 어떤 알고리즘을 사용할지에 맞게 필요한 신호를 살리고 불필요한 변화를 줄이는 과정이다.

  • 기본 이미지 처리 노트북의 범위

ROS/CV/CV_exercise#2/basic_image_processing.ipynb는 image loading, grayscale 변환, histogram, histogram equalization, CLAHE, masking, crop, translation, video/background subtraction 같은 기초 전처리를 다룬다. 함께 있는 Histogram_Equalization_eqImg.png, CLHE_ratio0.01.png부터 CLHE_ratio1.0.png까지의 결과 이미지는 contrast enhancement 강도에 따라 영상이 어떻게 달라지는지 비교하기 위한 산출물이다.

  • Histogram equalization을 왜 쓰는가

Histogram equalization은 어두운 영역이나 좁은 밝기 범위에 몰린 픽셀 값을 더 넓은 범위로 펴서 contrast를 키운다. 하지만 모든 영상에 무조건 좋은 것은 아니다. CLAHE처럼 local region별로 equalization을 적용하면 지역 contrast를 살릴 수 있지만, clip limit이나 ratio가 과하면 noise까지 강조된다. 그래서 실습에서 여러 CLAHE ratio 결과를 저장해 비교하는 것이다.

  • Mask, crop, translation이 필요한 이유

pcb.png, pcbCropped.png, pcbCroppedTranslated.png, pcbCroppedTranslatedDefected.png 같은 자료는 전처리가 단순 미화가 아니라 비교와 검출의 기준을 맞추는 작업임을 보여 준다. ROI crop은 관심 영역만 남겨 계산량과 잡음을 줄이고, translation은 template이나 기준 이미지와 위치를 맞추는 데 쓰인다. 결함 검출에서는 정렬이 조금만 틀어져도 차영상이나 matching 결과가 결함처럼 보일 수 있다.

  • Video와 background subtraction

Background_Subtraction.avi, surveillance.avi는 영상에서 시간 방향 정보를 활용하는 예다. 정지 이미지 전처리가 한 frame의 픽셀 분포를 다룬다면, background subtraction은 여러 frame에서 배경 모델을 만들고 움직이는 foreground를 분리한다. 로봇에서는 conveyor 위 움직이는 물체, 작업자 접근, 동적 장애물 검출로 이어질 수 있다.

  • 한 줄 정리

이미지 전처리는 픽셀 분포, 대비, 노이즈, 관심 영역을 조정해 이후 CV 알고리즘이 의미 있는 신호를 볼 수 있게 만드는 과정이다.

1.2. Filtering과 Edge Detection

1.2.1. Filtering과 Convolution

  • 기본 개념

Convolution은 이미지 처리와 CNN의 공통 기반이 되는 연산이다. 작은 kernel을 이미지 위로 이동시키며 주변 픽셀과 가중합을 계산한다. Kernel 값에 따라 smoothing, sharpening, edge detection, feature extraction 같은 다양한 효과를 만들 수 있다.

  • 왜 주변 픽셀을 함께 보는가

이미지의 의미는 픽셀 하나에만 있지 않다. 경계, 질감, 선, 모서리, 노이즈는 주변 픽셀과의 관계에서 나타난다. Convolution은 한 픽셀 주변의 작은 영역을 함께 보고, 그 지역 패턴이 어떤 성격을 가지는지 계산한다.

이 때문에 convolution은 지역적 특징을 다루는 데 적합하다. 고전 영상처리에서는 사람이 kernel 값을 정해 특정 패턴을 강조했고, CNN에서는 데이터가 그 kernel 값을 학습한다.

  • Filtering

Smoothing kernel은 주변 픽셀을 평균내어 노이즈를 줄인다. Sharpening kernel은 중심 픽셀과 주변 픽셀의 차이를 강조해 경계를 더 뚜렷하게 만든다. Sobel 같은 edge detection kernel은 x 방향이나 y 방향의 밝기 변화량을 계산한다.

즉 convolution은 이미지에서 지역적인 패턴을 계산하는 일반적인 틀이다.

  • Padding과 Stride

Convolution 결과의 크기는 padding과 stride에 따라 달라진다. Padding은 이미지 가장자리에 값을 덧붙여 출력 크기를 유지하거나 경계 정보를 덜 잃게 하는 방법이다. Stride는 kernel을 몇 칸씩 이동할지 정한다. Stride가 커지면 출력 feature map 크기가 줄고 계산량도 줄지만, 세밀한 위치 정보가 손실될 수 있다.

이 개념은 CNN에서도 그대로 이어진다. Classification에서는 어느 정도 위치 정보 손실을 허용할 수 있지만, segmentation에서는 위치 정보가 중요하므로 stride와 pooling으로 줄어든 해상도를 다시 복원해야 한다.

  • CNN과의 연결

Convolution을 이해하면 CNN도 더 잘 이해된다. 전통적 영상처리에서는 사람이 kernel을 설계했다. CNN에서는 kernel의 weight를 데이터로부터 학습한다. CNN의 convolution layer는 수작업 필터를 넘어, classification이나 detection에 필요한 특징 추출 필터를 자동으로 학습하는 구조다.

  • Kernel이 결과를 바꾸는 방식

Kernel은 어떤 주변 픽셀을 얼마나 반영할지 결정한다. 평균 필터는 주변 값을 고르게 반영해 노이즈를 줄이지만 edge도 흐리게 만든다. Gaussian filter는 중심에 가까운 픽셀에 더 큰 가중치를 주어 더 자연스러운 smoothing을 만든다. Sharpening kernel은 중심과 주변의 차이를 강조해 경계를 강하게 만든다.

Edge detection kernel은 방향성을 가진다. x 방향 gradient를 보는 kernel과 y 방향 gradient를 보는 kernel은 서로 다른 edge를 강조한다. 따라서 convolution 결과는 kernel의 수치뿐 아니라 kernel이 어떤 방향과 구조를 가정하는지에 따라 달라진다.

Filtering 실습 정리: 해석 기준

Filtering 실습에서는 결과 이미지만 보는 것이 아니라, 어떤 kernel이 어떤 영상 구조를 강조했는지 설명해야 한다. 노이즈 제거가 잘 되었더라도 중요한 경계가 사라졌다면 좋은 전처리라고 보기 어렵다. 반대로 edge를 강하게 만들었더라도 noise까지 같이 강조되면 후속 segmentation이 불안정해질 수 있다.

Filtering 실습 정리: 확인한 점

Kernel size와 결과의 관계가 중요하다. Kernel이 커질수록 더 넓은 영역을 한 번에 보지만, 세밀한 정보가 흐려질 수 있다. Kernel이 작으면 세부 구조는 보존되지만 노이즈 제거 효과가 약할 수 있다.

  • 한 줄 정리

Convolution은 이미지의 지역 패턴을 계산하는 기본 연산이며, 고전 영상처리와 CNN을 연결한다.

1.2.2. Edge Detection

  • 기본 개념

Edge는 이미지에서 밝기나 색상이 급격하게 변하는 위치다. 객체의 경계, 그림자, 질감 변화, 선 구조가 edge로 나타날 수 있다. Edge detection은 segmentation, feature extraction, object recognition의 기본 단계로 사용된다.

  • 왜 밝기 변화가 경계 단서가 되는가

객체와 배경은 서로 다른 표면, 색상, 조명 반응을 가지는 경우가 많다. 그래서 객체의 경계에서는 픽셀 값이 급격히 변한다. Edge detection은 이 변화량을 계산해 “여기서 무언가가 달라진다”는 위치를 찾는다.

하지만 모든 edge가 객체 경계는 아니다. 그림자, 질감, 글자, 반사도 edge를 만든다. 따라서 edge는 경계 후보이지 정답 경계가 아니다. 이 차이를 이해해야 edge 결과를 segmentation이나 feature extraction에 올바르게 사용할 수 있다.

  • 대표 방법

Sobel filter는 x 방향과 y 방향의 gradient를 계산해 edge를 찾는다. Laplacian filter는 2차 미분을 사용해 변화가 급격한 지점을 강조한다. Canny edge detector는 smoothing, gradient 계산, non-maximum suppression, hysteresis thresholding을 결합해 더 안정적인 edge를 찾는다.

Sobel은 방향별 변화량을 보기 때문에 수평/수직 경계의 강도를 해석하기 좋다. Laplacian은 변화가 급격한 지점을 더 직접적으로 강조하지만 noise에도 민감하다. Canny는 여러 단계를 결합해 얇고 연결성 있는 edge를 얻으려는 방법이다.

  • 주의할 점

Edge가 항상 객체 경계와 일치하지는 않는다. 조명 변화나 질감도 edge를 만들 수 있고, 흐릿한 경계는 edge로 잘 잡히지 않을 수 있다. 따라서 edge detection 결과는 후처리나 다른 정보와 함께 해석해야 한다.

  • Morphology와의 결합

Edge detection 결과는 얇고 끊어진 선으로 나타나는 경우가 많다. Dilation을 적용하면 끊어진 edge를 연결하거나 더 두껍게 만들 수 있고, erosion을 적용하면 불필요하게 두꺼운 영역을 줄일 수 있다. Closing을 사용하면 경계 사이의 작은 틈을 메울 수 있다.

실습 이미지에서 Edge_Detection_erodedEdge, Edge_Detection_dilatedEdge, Edge_Detection_combinedEdge 같은 결과가 있는 것은 edge detection이 단독으로 끝나는 것이 아니라 morphology 후처리와 함께 쓰인다는 점을 보여 준다.

  • Segmentation과의 연결

Edge는 segmentation의 단서가 될 수 있다. 경계가 분명한 객체는 edge를 이용해 영역을 나누기 쉽다. 하지만 texture가 많은 이미지에서는 객체 내부에도 edge가 많아져 segmentation이 어려워질 수 있다. 따라서 edge detection은 thresholding, region labeling, morphology와 함께 해석해야 한다.

Edge Detection 실습 정리

Morphology와 edge detection은 서로 연결된다. Dilation이나 erosion을 통해 edge를 두껍게 하거나 얇게 만들 수 있고, thresholding 결과의 경계를 morphology로 정리할 수도 있다.

  • 한 줄 정리

Edge detection은 이미지의 급격한 변화 지점을 찾아 객체 경계와 구조를 해석하는 과정이다.

1.3. Segmentation과 Morphology

1.3.1. Segmentation

  • 학습 목적

Segmentation은 이미지를 의미 있는 영역으로 나누는 작업이다. 컴퓨터비전에서 단순히 이미지 전체가 어떤 클래스인지 맞히는 것만으로는 충분하지 않을 때가 많다. 객체가 이미지 안에서 어디에 있는지, 어떤 픽셀들이 같은 영역에 속하는지 알아야 이후 counting, measurement, detection, tracking, robot grasping으로 연결할 수 있다.

수업 실습에서는 thresholding, adaptive thresholding, Otsu, hole filling, region labeling 같은 고전 segmentation 흐름을 다뤘다. 이 흐름은 최신 딥러닝 segmentation을 이해하기 전에도 중요한 기본기다. 픽셀 분포, 조명, 후처리 조건이 결과에 어떤 영향을 주는지 직접 볼 수 있기 때문이다.

  • Thresholding

Thresholding은 픽셀 값을 기준으로 전경과 배경을 나누는 가장 기본적인 segmentation 방법이다. Global thresholding은 이미지 전체에 하나의 기준값을 적용한다. 이미지 조명이 균일하고 전경/배경 밝기 차이가 크면 효과적이다.

하지만 실제 이미지는 조명이 균일하지 않다. 신문 이미지처럼 글자, 사진, 배경이 섞여 있거나, 조명이 한쪽으로 치우친 경우 하나의 threshold로는 모든 영역을 잘 나누기 어렵다. 이때 adaptive thresholding은 지역 영역별로 threshold를 계산해 조명 변화에 더 유연하게 대응한다.

Otsu thresholding은 전경과 배경의 분산 차이를 이용해 threshold를 자동으로 찾는 방법이다. 사람이 기준값을 직접 고르지 않아도 되지만, 이미지가 두 클래스 정도로 잘 나뉜다는 가정이 어느 정도 필요하다.

  • Hole Filling과 Region Labeling

Thresholding으로 전경/배경을 나누면 객체 내부에 구멍이 생기거나 작은 잡음 영역이 남을 수 있다. Hole filling은 객체 내부의 빈 영역을 채워 하나의 온전한 영역으로 만든다. Region labeling은 연결된 픽셀 덩어리를 서로 다른 객체 후보로 나누는 과정이다.

Region labeling은 segmentation 결과를 “픽셀의 집합”에서 “객체 단위 후보”로 바꾼다. 이 단계가 있어야 객체 개수 세기, 크기 측정, 위치 추정 같은 후속 작업을 할 수 있다.

  • 로봇/CV 연결

로봇 perception에서 segmentation은 물체 영역이나 장애물 영역을 구분하는 데 쓰일 수 있다. Bounding box보다 mask가 필요한 상황, 예를 들어 grasp 가능한 영역을 찾거나 작업 공간에서 물체의 실제 윤곽을 알아야 하는 경우 segmentation이 중요하다.

Segmentation 실습 정리

실습 이미지 확인 실습 정리

이 이미지는 신문 이미지가 흑백 영역으로 분리된 결과다. 큰 제목과 사진 영역은 비교적 분명하게 분리되지만, 사진 내부의 밝기 변화와 글자 주변에서는 세부 정보가 거칠게 나뉜다. 이를 통해 global thresholding은 단순하고 빠르지만, 이미지 내부의 지역적 조명과 질감 변화까지 섬세하게 처리하지는 못한다는 점을 확인할 수 있다.

지역 적응 thresholding 결과는 이미지의 작은 영역마다 기준을 다르게 적용한다. 조명이 균일하지 않은 상황에서는 global threshold보다 나은 결과를 만들 수 있지만, window 크기나 지역 통계 설정에 따라 잡음이 늘거나 경계가 불안정해질 수 있다.

  • 실습에서 이해할 점

Segmentation은 한 번의 함수 호출로 끝나지 않는다. 입력 이미지의 밝기 분포를 보고, thresholding 방식을 선택하고, morphology나 hole filling으로 후처리하고, region labeling으로 객체 단위 정보를 만든다. 이 전체 흐름을 이해해야 segmentation 결과를 해석할 수 있다.

특히 결과가 좋다/나쁘다로 끝내면 안 된다. 어떤 조명 조건에서 global thresholding이 실패했는지, adaptive thresholding이 어떤 부분을 보완했는지, hole filling과 labeling이 어떤 오류를 줄였는지를 설명해야 한다.

  • Thresholding 실습의 목적

ROS/CV/CV_exercise#3/week4_exercise.ipynb와 결과 이미지들은 global thresholding, graylevel thresholding, locally adaptive thresholding, Otsu thresholding, hole filling, region labeling을 다룬다. Global_Thresholding_bw.png, Locally_Adaptive_Thresholding_local.png, Graylevel_Thresholding_thresholded.png 같은 산출물은 threshold 기준을 어떻게 잡느냐에 따라 foreground/background가 달라진다는 점을 보여 준다.

  • Global과 local threshold의 차이

Global threshold는 영상 전체에 하나의 기준값을 적용한다. 조명이 균일하고 객체와 배경의 밝기 차이가 분명하면 간단하고 빠르다. 하지만 paper.png, book.png, news.png처럼 조명이 위치마다 다르거나 그림자가 있는 경우에는 한 기준값으로 전체 영역을 잘 나누기 어렵다. Local/adaptive threshold는 주변 영역의 통계로 기준값을 정하므로 비균일 조명에서 더 안정적일 수 있다.

  • Otsu가 해결하려는 문제

Otsu thresholding은 threshold 값을 사람이 직접 정하지 않고, 두 class의 분산이 잘 분리되도록 기준값을 선택한다. otsu_animation.avi는 threshold가 바뀔 때 class 분리가 어떻게 달라지는지 이해하기 위한 자료다. Otsu가 잘 동작하려면 foreground와 background의 histogram이 어느 정도 분리되어 있어야 한다. 두 분포가 심하게 겹치면 자동 threshold도 안정적이지 않다.

  • Hole filling과 region labeling이 필요한 이유

Thresholding만으로 얻은 binary mask에는 구멍, 작은 잡음, 끊어진 영역이 남을 수 있다. Hole_Filling_bw.png, Hole_Filling_filled.png는 객체 내부 hole을 채우는 후처리의 의미를 보여 준다. Region_Labeling_bw.png, Region_Labeling_rgbLabel.png는 연결된 foreground 영역마다 label을 붙여 객체 개수와 위치를 다루는 단계다.

  • 얼굴/객체 filtering 예시

Face_ref_*, Face_Training_*, Face_Test_*, Filtered_Face_*, Filtered_Face_Detection.png는 segmentation 이후 조건 기반 filtering이 이어질 수 있음을 보여 준다. 단순히 foreground를 얻는 것에서 끝나지 않고, 크기, 모양, 위치, 색상, texture 조건으로 관심 객체만 남겨야 실제 detection pipeline이 된다.

  • 한 줄 정리

Segmentation은 픽셀을 의미 있는 영역으로 나누고, 후처리를 통해 객체 단위 정보로 바꾸는 컴퓨터비전의 핵심 과정이다.

Morphology

  • 학습 목적

Morphology는 이미지의 형태를 기준으로 처리하는 방법이다. Thresholding이나 segmentation을 수행한 뒤에는 작은 잡음, 끊어진 선, 내부 구멍, 붙어버린 객체 같은 문제가 자주 생긴다. Morphology는 이런 문제를 구조 요소를 사용해 형태적으로 다듬는다.

대표 연산은 erosion, dilation, opening, closing이다. 이 연산들은 픽셀 값을 단순히 부드럽게 만드는 필터가 아니라, 객체의 크기와 연결성, 구멍, 경계를 조절한다.

  • Erosion과 Dilation

Erosion은 객체 영역을 깎아내는 연산이다. 작은 객체나 얇은 연결이 사라질 수 있다. 따라서 작은 잡음을 제거하거나 객체를 분리하는 데 쓰일 수 있다. 하지만 과하게 적용하면 실제 객체도 줄어든다.

Dilation은 객체 영역을 확장하는 연산이다. 끊어진 선을 연결하거나 작은 구멍을 메울 수 있다. 하지만 과하게 적용하면 가까운 객체들이 서로 붙어버릴 수 있다.

  • Opening과 Closing

Opening은 erosion 후 dilation을 수행한다. 작은 잡음을 먼저 제거하고, 남은 객체의 크기를 어느 정도 복원한다. Closing은 dilation 후 erosion을 수행한다. 작은 구멍이나 틈을 메운 뒤 객체 크기를 다시 조정한다.

중요한 것은 연산 순서다. Erosion과 dilation은 서로 반대처럼 보이지만, 순서에 따라 결과가 달라진다. Opening은 작은 전경 잡음을 제거하는 데 적합하고, closing은 객체 내부의 작은 배경 구멍을 메우는 데 적합하다.

  • 구조 요소

Morphology의 핵심은 구조 요소다. 구조 요소의 크기와 모양에 따라 보존되는 형태와 제거되는 형태가 달라진다. 작은 원형 구조 요소는 작은 잡음 제거에 적합하고, 선형 구조 요소는 특정 방향의 선을 강조하거나 제거할 수 있다.

따라서 morphology는 “무슨 함수를 썼는가”보다 “어떤 구조 요소로 어떤 형태를 보존하려 했는가”가 중요하다.

  • 로봇/CV 연결

로봇 perception에서는 segmentation mask를 바로 사용하기보다 morphology로 정리하는 경우가 많다. 작은 noise를 제거하고, 물체 영역의 구멍을 메우고, grasp 대상의 윤곽을 안정화하는 데 사용할 수 있다. Depth image의 빈 영역 보정이나 작업 공간 mask 정리에도 연결된다.

Morphology 실습 정리

실습 이미지 확인 실습 정리

이 이미지는 동전 후보 영역이 서로 다른 색의 connected component로 표시된 결과다. 배경과 동전이 분리되고, 각 동전 영역이 개별 객체처럼 labeling된다. 일부 동전이 붙어 있거나 분리 경계가 애매한 부분도 보이는데, 이런 부분이 morphology와 region labeling에서 구조 요소 선택이 중요하다는 점을 보여 준다.

Fence 예제에서는 erosion이 얇은 구조와 배경 잡음에 어떤 영향을 주는지 확인할 수 있다. 구조 요소를 어떻게 선택하느냐에 따라 울타리처럼 반복적인 선 구조가 보존되거나 사라진다.

Closing 기반 작은 구멍 제거 결과는 객체 내부의 빈 영역을 메우는 morphology의 역할을 보여 준다. 단순 thresholding 결과에서는 내부 구멍이 남을 수 있지만, closing을 사용하면 더 온전한 객체 mask를 만들 수 있다.

  • 실습에서 이해할 점

Morphology는 segmentation 결과를 실제 객체 분석에 사용할 수 있도록 다듬는 과정이다. 결과가 좋아 보이는지보다, 어떤 형태가 제거되고 어떤 형태가 남았는지 설명하는 것이 중요하다. 구조 요소가 커지면 더 큰 잡음도 제거할 수 있지만 실제 객체 정보도 손상될 수 있다.

  • Erosion과 dilation 실습의 의미

ROS/CV/CV_exercise#4/code.ipynb와 결과 이미지들은 1D erosion/dilation, binary erosion, dilation, graylevel morphology, edge detection, hole removal, noise removal, counting coins를 다룬다. 1D_Erosion_Dilation_* 이미지는 structuring element 크기가 커질수록 신호의 작은 구조가 사라지거나 확장되는 과정을 보여 준다.

  • Structuring element가 결과를 결정한다

Binary_Erosion_Coins_disk_*, Binary_Erosion_Coins_square_* 결과는 같은 erosion이라도 disk와 square 구조 요소가 다른 결과를 만든다는 점을 보여 준다. Morphology는 단순 필터가 아니라 “어떤 모양을 기준으로 객체를 해석할 것인가”를 정하는 연산이다. 원형 동전을 다룰 때 disk가 자연스럽고, 격자나 직선 구조를 다룰 때 square나 line 구조 요소가 더 적합할 수 있다.

  • Noise removal과 hole removal

Bacteria_noise*, Bacteria_denoise*, Small_Hole_Removal_*는 morphology가 segmentation mask 후처리에 왜 필요한지 보여 준다. Erosion은 작은 흰 잡음을 줄일 수 있지만 객체도 함께 작아진다. Dilation은 끊어진 영역을 연결하거나 hole을 줄일 수 있지만 객체가 커진다. Opening과 closing은 이 두 효과를 순서대로 조합해 noise 제거와 구멍 보정을 수행한다.

  • Counting coins로 보는 객체 분석

Counting_Coins_bw*, Counting_Coins_dilated.png, Counting_Coins_label*는 morphology와 region labeling이 연결되는 예다. 동전이 붙어 있거나 mask가 끊겨 있으면 label 개수가 실제 객체 개수와 달라진다. Morphology로 객체 영역을 정리한 뒤 labeling해야 count, centroid, area 같은 객체 속성을 안정적으로 얻을 수 있다.

  • Edge detection과 morphology의 연결

Edge_Detection_erodedEdge.png, Edge_Detection_dilatedEdge.png, Edge_Detection_combinedEdge.png는 erosion/dilation 차이를 이용해 경계 성분을 만들 수 있음을 보여 준다. Edge는 gradient 연산으로만 얻는 것이 아니라 형태학적 연산으로도 추출할 수 있다. 이 관점은 binary mask의 외곽선이나 객체 경계 후처리에 유용하다.

  • 한 줄 정리

Morphology는 객체의 형태와 연결성을 기준으로 segmentation 결과를 다듬는 전처리/후처리 도구다.

1.4. 전처리 핵심 코드

1.4.1. 전처리, Threshold, Morphology 핵심 코드 인용

Image preprocessing 실습은 한 장의 이미지를 바로 모델에 넣기 전에 contrast, noise, threshold, morphology를 조절하는 과정이다.

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
eq = cv2.equalizeHist(gray)
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
local_eq = clahe.apply(gray)

equalizeHist는 전체 histogram을 펴서 contrast를 키운다. 하지만 조명이 위치마다 다른 이미지에서는 전체 equalization이 일부 영역을 과하게 만들 수 있다. CLAHE는 작은 tile 단위로 contrast를 조절하고 clip limit으로 과증폭을 막는다. 그래서 조명 불균일이 있는 로봇 카메라 이미지에서는 global 방식과 local 방식을 비교해야 한다.

Threshold 실습의 핵심은 grayscale을 binary mask로 바꾸는 기준을 어디서 정하느냐다.

_, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
adaptive = cv2.adaptiveThreshold(
    gray,
    255,
    cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
    cv2.THRESH_BINARY,
    11,
    2
)

threshold는 하나의 기준값으로 전체 이미지를 나눈다. adaptiveThreshold는 주변 영역의 밝기를 기준으로 pixel마다 다른 threshold를 적용한다. 그래서 배경 밝기가 균일하면 global threshold가 단순하고, 그림자나 조명 변화가 크면 adaptive threshold가 더 안정적일 수 있다.

Morphology는 binary mask의 모양을 다듬는 후처리다.

kernel = np.ones((3, 3), np.uint8)
eroded = cv2.erode(binary, kernel, iterations=1)
dilated = cv2.dilate(binary, kernel, iterations=1)
opened = cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel)
closed = cv2.morphologyEx(binary, cv2.MORPH_CLOSE, kernel)

erode는 작은 흰 영역을 줄이고, dilate는 흰 영역을 키운다. open은 작은 noise를 제거하는 데, close는 객체 내부의 작은 구멍을 메우는 데 자주 쓴다. Segmentation mask나 YOLO 후처리에서 mask가 끊기거나 작은 noise가 생기면 morphology가 객체 count, contour, centroid 계산을 안정화한다.

2. Feature Extraction과 Matching

2.1. Feature Matching

2.1.1. 학습 목적

Feature extraction은 이미지에서 반복적으로 찾을 수 있는 특징을 추출하는 과정이고, feature matching은 서로 다른 이미지에서 같은 장면이나 같은 물체에 해당하는 특징을 연결하는 과정이다. 이 개념은 template matching, image stitching, homography estimation, object recognition, tracking의 기반이 된다.

딥러닝 이전의 CV에서 feature는 사람이 설계한 기준으로 추출되었다. 하지만 이 사고방식은 여전히 중요하다. 로봇이 카메라로 본 장면과 이전 장면을 비교하거나, 서로 다른 시점의 이미지를 맞추거나, 평면 물체의 위치 관계를 추정할 때 feature matching이 필요하다.

2.1.2. Template Matching

Template matching은 찾고 싶은 작은 이미지 조각을 큰 이미지 위에서 이동시키며 유사도를 계산하는 방식이다. 단순하고 직관적이지만 scale, rotation, illumination 변화에 약하다.

교회 이미지와 창문 template은 template matching의 기본 구조를 보여 준다. 큰 이미지 안에서 작은 창문 패턴과 비슷한 위치를 찾는 것이다. 이 방식은 대상의 크기와 방향이 거의 일정할 때 유효하지만, 시점이나 scale이 변하면 성능이 떨어질 수 있다.

2.1.3. Keypoint와 Descriptor

Harris corner, SIFT, ORB 같은 방법은 이미지에서 반복적으로 찾기 쉬운 keypoint를 찾고, 그 주변 패턴을 descriptor로 표현한다. Keypoint는 특징점의 위치이고, descriptor는 그 위치 주변의 모양을 수치 벡터로 나타낸 것이다.

SIFT는 scale과 rotation 변화에 강한 특징을 만드는 대표적인 방법이다. ORB는 빠른 계산을 목표로 하는 binary descriptor 계열 방법이다. 실습에서는 SIFT/ORB를 통해 서로 다른 이미지 사이의 대응점을 찾는 흐름을 확인한다.

2.1.4. Matching과 Outlier 제거

Descriptor를 비교하면 서로 다른 이미지 사이의 대응점을 찾을 수 있다. 하지만 모든 match가 맞는 것은 아니다. 반복 패턴, 노이즈, 질감 부족, 조명 변화 때문에 잘못된 match가 생긴다.

RANSAC은 outlier가 섞인 match 중에서 일관된 변환 관계를 설명하는 subset을 찾는다. 이를 통해 homography 같은 기하 변환을 안정적으로 추정할 수 있다.

2.1.5. Homography

Homography는 평면 장면이나 카메라 시점 변화 사이의 projective transform을 나타낸다. 책 표지, 건물 벽면, 평면 포스터처럼 하나의 평면에 가까운 대상은 homography로 시점 변화를 설명할 수 있다.

실습 이미지에는 book, church, coke, gates 같은 이미지 쌍이 포함되어 있다. 이들은 서로 다른 시점의 장면에서 feature를 찾고, matching과 homography를 통해 대응 관계를 추정하는 흐름과 연결된다.

2.1.6. 로봇/CV 연결

로봇 perception에서 feature matching은 카메라 위치 추정, 물체 pose 추정, 시점 변화 보정, visual odometry의 기초와 연결된다. 로봇이 같은 물체를 다른 각도에서 봐도 같은 대상으로 인식하려면 feature와 기하 관계를 이해해야 한다.

2.1.7. Feature Matching 실습 정리

  • 실습에서 이해할 점

Feature matching은 이미지 전체를 비교하는 것이 아니다. 반복 가능한 지점을 찾고, 그 지점 주변을 descriptor로 표현하고, 대응점 사이의 기하 관계를 추정한다. 이 과정을 통해 이미지가 이동하거나 회전하거나 시점이 달라져도 같은 장면을 연결할 수 있다.

  • Template matching의 위치

ROS/CV/CV_exercise#5/CV_exercise#5_template_matching/code.ipynbchurch.pngwindow.png를 사용해 작은 template이 큰 이미지 안 어디에 있는지 찾는 흐름을 다룬다. Template matching은 sliding window로 template과 image patch의 유사도를 계산한다. 객체의 scale, rotation, perspective가 크게 변하지 않는 상황에서는 단순하고 직관적이다.

하지만 template matching은 대상의 크기나 회전이 바뀌면 약해진다. 그래서 feature descriptor 기반 matching을 함께 배운다. Template matching은 “정해진 모양이 거의 그대로 있는가”를 보는 방법이고, SIFT/ORB matching은 “시점과 크기가 달라도 대응되는 특징점이 있는가”를 보는 방법이다.

  • SIFT/ORB 실습의 흐름

ROS/CV/CV_exercise#6/code.ipynbgates.jpg, church1.jpg, church2.jpg, book1.jpg, book2.jpg, coke1.png, coke2.png 같은 자료로 SIFT descriptor, keypoint visualization, descriptor matching을 수행한다. SIFT는 scale-space에서 특징점을 찾고 방향을 부여해 회전과 scale 변화에 비교적 강한 descriptor를 만든다. ORB는 더 빠른 binary descriptor를 사용해 실시간성에 유리하다.

  • Matching에서 좋은 대응점을 고르는 이유

Feature matching은 descriptor 거리만 작다고 끝나지 않는다. 잘못된 대응점이 섞이면 homography나 pose 추정이 틀어진다. 그래서 ratio test, cross-check, RANSAC 같은 후처리가 필요하다. 실습 이미지처럼 책 표지나 건물 facade를 맞출 때는 반복 pattern과 비슷한 texture가 많아 오매칭이 생기기 쉽다.

  • Video 자료와 tracking으로의 확장

Car-01.mp4, crew_4cif.mp4, ice_4cif.mp4와 대응되는 _KL.avi 결과는 feature나 motion cue가 video tracking으로 확장될 수 있음을 보여 준다. 정지 이미지 matching은 두 이미지 사이 대응점 문제이고, video tracking은 시간에 따라 같은 대상의 위치를 계속 갱신하는 문제다. 로봇에서는 이 흐름이 visual servoing, object tracking, localization으로 이어질 수 있다.

  • 한 줄 정리

Feature matching은 이미지 사이의 반복 가능한 특징을 연결해 같은 장면의 대응 관계와 기하 변환을 추정하는 방법이다.

2.1.8. Feature Matching 핵심 코드 인용

Template matching 실습은 작은 template과 원본 이미지의 유사도를 위치별로 계산하는 과정이다.

church = imread('church.png').astype(np.float64)
window = imread('window.png').astype(np.float64)

church -= np.mean(church)
window -= np.mean(window)

flippedWindow = np.flipud(np.fliplr(window))
r = convolve2d(church, flippedWindow, mode='same')

평균을 빼는 이유는 전체 밝기 차이가 matching score를 지배하지 않게 하기 위해서다. flippedWindow는 convolution 정의에 맞춘 template이고, r은 각 위치에서 template과 이미지 영역이 얼마나 비슷한지 나타내는 response map이다. 최고값 위치를 찾으면 template이 가장 잘 맞는 후보 위치를 얻는다.

SIFT 실습은 특징점 위치와 주변 패턴 표현을 분리해서 만든다.

sift = cv2.SIFT_create(contrastThreshold=0.04)
keypoints, descriptors = sift.detectAndCompute(img, None)
img_keypoints = cv2.drawKeypoints(
    img,
    selected_keypoints,
    None,
    flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS
)

keypoints는 이미지의 어느 위치가 반복적으로 찾기 쉬운지를 담고, descriptors는 그 주변 모양을 비교 가능한 벡터로 바꾼다. 그래서 SIFT/ORB matching은 template matching처럼 같은 모양이 같은 크기와 방향으로 있는지만 보지 않고, scale과 rotation이 달라져도 대응되는 지역 특징이 있는지 비교할 수 있다.

2.2. Eigen Image와 PCA

2.2.1. 학습 목적

이미지는 픽셀 수만큼 차원이 큰 데이터다. 얼굴 이미지 하나가 92x112 픽셀이라면 10304차원 벡터로 볼 수 있다. 이런 고차원 데이터를 그대로 비교하면 계산도 어렵고, 어떤 변화가 중요한지 해석하기도 어렵다.

PCA는 데이터의 분산을 가장 잘 설명하는 축을 찾는 차원 축소 방법이다. Eigen image는 이미지 데이터에 PCA를 적용해 주요 변동 방향을 이미지처럼 표현한 것이다.

2.2.2. 왜 차원 축소가 필요한가

고차원 픽셀 공간에서는 모든 픽셀이 같은 비중으로 비교된다. 하지만 실제 이미지 데이터에서 모든 픽셀이 같은 의미를 갖지는 않는다. 조명 변화, 얼굴 방향, 표정, 배경, 노이즈처럼 반복적으로 나타나는 변화가 있고, 이 변화 중 일부가 데이터 차이를 크게 설명한다.

PCA는 이런 주요 변동 방향을 찾아 원본 이미지보다 낮은 차원으로 표현한다. 이렇게 하면 계산량을 줄일 수 있고, 노이즈보다 데이터 전체를 설명하는 큰 패턴에 집중할 수 있다.

2.2.3. 이미지 데이터셋과 벡터 공간

실습 폴더에는 AT&T face dataset 형태의 PGM 이미지들이 포함되어 있다. 각 얼굴 이미지는 같은 크기의 grayscale 이미지이며, 이를 펼치면 하나의 고차원 벡터가 된다.

원본 얼굴 이미지
-> 픽셀 행렬 A
-> flatten된 10,304차원 벡터 x
-> PCA 입력 행렬 X

위 얼굴 이미지는 단순한 사진이 아니라 PCA 관점에서는 고차원 벡터 하나다. 여러 얼굴 벡터를 모으면 얼굴 데이터가 어떤 방향으로 많이 변하는지 계산할 수 있다.

2.2.4. 평균 이미지와 Eigen Face

Eigen face에서는 먼저 모든 얼굴의 평균 이미지를 계산한다. 각 얼굴 이미지는 평균 얼굴에서 얼마나 벗어나는지로 표현할 수 있다. PCA는 이 벗어남을 가장 잘 설명하는 주요 성분을 찾는다.

주요 성분은 얼굴 이미지의 변화 방향을 나타낸다. 예를 들어 조명 방향, 얼굴 형태, 눈/코/입 주변의 차이 같은 변동이 principal component로 나타날 수 있다.

2.2.5. 인식에서의 사용 방식

새 얼굴 이미지가 들어오면 같은 방식으로 평균 얼굴을 빼고 eigen face 축에 projection할 수 있다. 그러면 원본 픽셀 전체가 아니라 PCA 계수 벡터로 얼굴을 표현할 수 있다. 이 계수 벡터 사이의 거리를 비교하면 얼굴 유사도를 판단할 수 있다.

이 방식은 현대 딥러닝 embedding과 구조적으로 닮아 있다. 원본 이미지를 직접 비교하지 않고, 더 낮고 의미 있는 feature space에서 비교한다는 점이 같다.

2.2.6. 차원 축소의 의미

PCA를 사용하면 원래 픽셀 전체를 쓰지 않고도 얼굴을 낮은 차원의 계수로 표현할 수 있다. 이는 저장과 계산을 줄일 뿐 아니라, 데이터에서 중요한 변동과 덜 중요한 노이즈를 구분하는 데 도움을 준다.

현대 딥러닝에서도 embedding이라는 개념이 중요하다. 이미지를 직접 픽셀로 비교하는 대신, 의미 있는 feature space에서 비교하는 것이다. Eigen image와 PCA는 이런 사고방식의 고전적 출발점으로 볼 수 있다.

2.2.7. Eigen Image와 PCA 실습 정리

  • 실습에서 이해할 점

Eigen image 실습은 이미지를 단순 픽셀 배열이 아니라 벡터 공간의 점으로 보는 관점을 만든다. 얼굴 인식이나 이미지 비교에서 중요한 것은 픽셀 하나하나가 아니라, 데이터 전체의 주요 변동 구조를 찾는 것이다.

  • 얼굴 이미지 dataset을 행렬로 바꾸는 이유

ROS/CV/CV_exercise#5/CV_exercise#5_eigen_image/code.ipynbatt_faces_aligned_lighting 자료는 여러 얼굴 이미지를 같은 크기와 정렬 상태로 맞춘 뒤 vector로 펼쳐 data matrix를 만드는 흐름을 다룬다. 각 이미지는 하나의 고차원 벡터가 되고, 여러 이미지가 모이면 얼굴 데이터가 차지하는 subspace를 PCA로 찾을 수 있다.

  • Mean face와 eigenface의 의미

Mean_Face.fig, Eigenfaces.fig, Fisherfaces.fig 산출물은 평균 얼굴과 주요 변화 방향을 시각화한다. Mean face는 데이터 전체의 중심이고, eigenface는 얼굴 이미지들이 주로 어떻게 달라지는지를 나타내는 basis image다. 조명, 얼굴 윤곽, 눈/코/입 위치 차이가 주요 variance로 나타날 수 있다.

  • 차원 축소가 인식에 도움이 되는 이유

원본 이미지 픽셀 전체를 그대로 비교하면 차원이 너무 높고 noise와 조명 변화의 영향을 크게 받는다. PCA는 가장 큰 분산 방향을 남겨 얼굴을 더 낮은 차원의 coefficient vector로 표현한다. 이 coefficient를 비교하면 원본 픽셀 비교보다 계산량이 줄고, 데이터의 주요 구조를 기준으로 인식할 수 있다.

  • Video keyframe 자료의 의미

keyframes, keyframes_cropped, light.mpg 같은 자료는 eigen image가 정지 얼굴 사진뿐 아니라 frame sequence 분석으로 확장될 수 있음을 보여 준다. Video에서 frame을 추출하고 정렬/crop한 뒤 PCA를 적용하면 시간에 따라 변하는 조명이나 표정, 자세 변화가 어떤 주성분으로 나타나는지 볼 수 있다.

  • 한 줄 정리

Eigen image와 PCA는 고차원 이미지를 주요 변동 축으로 압축해 표현하고, 이미지 데이터를 feature space에서 이해하게 해 주는 방법이다.

profile
AI 공부합니다

0개의 댓글