본문 바로가기

영상처리/OpenCV 및 영상처리 이론

OpenCV 기초 - 9. 영상 필터링 (2) - 엣지 검출 방향성 필터를 이용한 엣지 검출에 대해서 알아보겠습니다. 영상처리에서는 영상을 이해하고 영상 내의 정보를 이용하여 여러가지 작업을 수행합니다. 이때 영상 내의 정보에는 여러가지 정보들이 있을 수 있습니다. 이중 특별히 feature라고 명칭하는, 영상이 가지는 특별한 정보들이 있습니다. blob, corner, edge가 이러한 feature(특징 or 특징점)에 해당하는 기본적인 요소들입니다. - 코드 더보기 /*------------------------------------------------------------------------------------------*\ This file contains material supporting chapter 6 of the cookbook: Compu.. 더보기
OpenCV 기초 - 8. 영상 필터링 (1) - 저주파 필터, 중간값 필터 영상 필터링에 대해서 알아보겠습니다. 영상처리에서 필터링 원치 않는 노이즈를 제거하거나 원하는 정보 ( feature )만 뽑아내 사용하는 형태로 구현됩니다. 이번 글에서는 영상 내의 노이즈를 제거하기 위한 필터링에 대해서 알아보겠습니다. 일반적으로 영상은 공간 영역에서 파란색 신호와 같이 저주파 신호의 형태를 보입니다. 경계나 모서리를 제외하면 밝기 값이 급격하게 변하지 않기 때문입니다. 반대로 노이즈 신호는 이전의 소금 후추 잡음에서 확인하였듯이 랜덤한 위치에 랜덤한 값을 가지는 밝기 값이 형성되기 때문에 상대적으로 고주파 신호의 성격을 가지게 됩니다. 이러한 특징을 이용하여 영상 내에 존재하는 고주파 신호 성분을 제거함으로써 영상의 노이즈를 제거할 수 있습니다. - GaussianBlur 저주파 필.. 더보기
OpenCV 기초 - 7. 전경 객체 추출 (워터쉐드 + 그랩컷) 워터쉐드와 그랩컷을 사용한 객체 추출에 대해서 알아보겠습니다. - void watershed ( InputArray image, InputOutputArray makers ) 입력 영상을 여러 구역으로 나누는 과정을 수행할 때, 사용하는 방법 중 하나로 워터쉐드 알고리즘이 있습니다. 워터쉐드 알고리즘에 대해서 간단히 설명하자면 엣지에 해당하는 부분을 "산등성이"로 보고, 특징이 없는 균일한 영역을 "계곡"으로 생각하여 객체분할을 수행합니다.먼저 영상의 그래디언트를 구합니다. 이 과정을 통해서 질감이 없는 평탄한 지역에는 "계곡"이나 "웅덩이"가 생기게 되고 (낮은 지점), 영상 내의 엣지가 두드러지는 부분에서는 "산" 또는 "산맥"이 (높은 지점) 생기게 됩니다. 이렇게 만든 그래디언트 영상에서 사용자가.. 더보기
OpenCV 기초 - 6. 모폴로지 연산 (2) - 엣지, 코너 검출 모폴로지 연산을 이용한, 간단한 형태의 엣지 및 코너 검출에 대해서 알아보겠습니다. 모폴로지 필터를 잘 이용하면 영상 내의 특정 특징을 검출할 수 있습니다. 이번 코드에서는 구현을 위해 MorphoFeatures라는 클래스를 정의하여 사용하게 되어 있습니다. - 엣지 영상의 엣지를 감지하는 방법은 간단히 침식된 영상과 팽창된 영상 간의 차이를 계산하여 구할 수 있으며 이를 위 코드를 통해 확인할 수 있습니다. 두 변환 영상이 주로 엣지 부분에서 차이가 발생하기 때문에 엣지가 두드러지게 되며 morphologyEx 함수에 인자로 MORPH_GRADIENT를 넣어 엣지를 얻을 수 있게 됩니다. 비슷한 결과를 얻는 방법으로는 (팽창 - 원영상), (침식 - 원영상)이 가능하며 결과는 약간 얇아지게 됩니다. -.. 더보기
OpenCV 기초 - 5. 모폴로지(morphology) 연산 (1) - 침식, 팽창 모폴로지 연산에 대해 알아보고 이를 이용한 영상의 침식, 팽창에 대해 알아 보겠습니다. 모폴로지 필터링은 60년대에 영상 분석과 처리를 위해 처음 등장하였습니다. 미리 특정한 형태를 띠는 필터를 만들고 이 필터를 영상에 씌워 새로운 영상을 얻어내는 기법입니다. 이러한 모폴로지 연산은 어떻게 사용하냐에 따라서 여러 결과를 얻을 수 있습니다. 침식과 팽창 연산은 현재 픽셀을 기준하여 필터를 적용하여 필터 영역안의 값을 확인하고 현재 픽셀의 값을 수정하게 됩니다. - 침식 : 필터 영역내 픽셀 중 최소 픽셀값을 현재 픽셀값에 대입 - 팽창 : 필터 영역내 픽셀 중 최대 픽셀값을 현재 픽셀값에 대입 이러한 특징을 슬라이드를 통해 확인할 수 있으며 팽창 연산을 수행하면 결과로 10.png의 파란색 박스가 오른쪽의.. 더보기
OpenCV 기초 - 4. 영상 이진화 + 관심 영역(ROI) 정의 영상 이진화, 관심영역(ROI)에 대해 알아보고 Image Watch를 사용하여 디버깅하는 방법을 알아보겠습니다. - ROI, addWeighted, copyTo 먼저 ROI란 관심 영역이라는 뜻으로 영상 내에서 작업을 수행하고자 하는 특정 영역을 의미합니다. lenna이미지에 글씨를 넣기 위해서 글씨를 넣고자 하는 영역을 39번째 줄을 통해 설정하였습니다. - Image Watch 이전에 언급한 적이 있던 Image Watch 기능을 통해 영역이 잘 설정되었는지 확인해봅시다. Image Watch를 사용하기 위해서는 디버그를 수행하여야 합니다. 이를 위해서 imageROI가 설정된 이후 부분에 브레이크 포인트를 잡아주고 디버깅을 통해 imageROI의 내부값을 확인해보겠습니다. 디버깅 상태에서 Mat .. 더보기
OpenCV 기초 - 3. 픽셀 접근 방법 영상의 픽셀에 접근하여 데이터를 처리하는 방법에 대해서 알아보겠습니다. - at( int x, int y ) 각 원소에 접근하기 위한 방법으로 Mat의 at 메소드를 이용할 수 있습니다. at은 컴파일 시 타입을 필요로 하는데요. 이는 처리할 영상이 컬러인지 그레이인지, 어떤 데이터가 들어있는지를 알아야 하기 때문입니다. 이러한 타입 설정은 image.at(j,i) = 255; image.at(j,i)[channel] = 255; 와 같이 코드로 표현할 수 있습니다. uchar의 경우 그레이(흑백) 이미지, cv::Vec3b의 경우 컬러 이미지에 사용되며 3개의 unsigned char를 가지는 벡터가 됩니다. 컬러이미지의 경우 RGB 3개의 채널이 있기 때문에 어떤 채널에 접근할 것인지를 추가적으로 입.. 더보기
OpenCV 기초 - 2. 영상처리 준비(2) 영상 생성, 크기 출력, 뒤집기, 복사에 대해서 알아보겠습니다. - 멤버변수 data imread() 함수를 통해 영상을 읽을 수 있지만 지난번에 설명드렸듯이 사진이 존재하지 않으면 문제가 발생합니다. 이러한 문제를 예방하기 위하여 영상이 잘 불러와졌는지 확인하는 절차를 습관화하여야 하며 이를 if (!image.data) { //영상 데이터 없음 return 0; } 의 형태로 간단하게 구현할 수 있습니다. ※ 참고 : data는 영상 데이터가 들어갈 메모리를 가리키는 변수입니다. 영상을 읽지 못 했을 경우 0으로 값이 설정되게 되어있습니다. - void flip( InputArray src, OutputArray dst, int flipCode ) flip 함수는 간단하게 원본 영상을 뒤집는 과정을 .. 더보기
OpenCV 기초 - 1. 영상처리 준비 (1) + Image Watch 설치 - Image Watch 설명에 들어가기에 앞서서 유용한 툴을 하나 소개합니다. Visual Studio - 도구 탭 - 확장 및 업데이트에 들어갑니다. 온라인 탭에서 우측 상단에 검색으로 image watch를 검색하여 설치하면 이후 디버깅 과정에서 편리하게 작업을 할 수 있습니다. 이번 글에서는 영상 불러오기, 띄우기, 저장하기에 대해서 알아보겠습니다. 영상을 불러오기 위해 먼저 영상을 담을 변수를 선언해야 합니다. OpenCV2에서부터는 이러한 이미지(영상)을 담기 위해서 cv::Mat 클래스의 객체를 이용하게 됩니다. - Mat 행렬의 의미하며 cv::Mat image;을 수행하면 0x0의 사이즈를 가지는 행렬이 만들어지게 됩니다. 이때 행렬의 원소 하나하나가 영상의 한 픽셀을 담당하게 된다고 생.. 더보기