카테고리 없음

image feature extraction threshold 추출 방법의 효능

구름갈대호수 2022. 3. 23. 17:17

Sobel (high threshold)의 extraction 추출 방법의 효능



개진 에지가 들어간 영상을 갖고 있지만, 눈에 보이는 것들은 확실히 장면나의 중요한 외곽선에 속해 있다. 캐니 알고리즘은 외곽선의 ‘최적’ 맵을 생산하기 위한 두 가지 에지 맵을 조합한다.

에지의 연속적인 경로가 존재하는 낮은 경계값 에지맵의 에지 점만 유지하고, 높은 경계값 에지 맵에 속한 에지에 대한 에지 점을 연결하게 처리한다. 따라서 낮은 경계값 맵에서 모든 고립된 에지 점이 연결된 부분을 제거하는 동안 높은 경계값 맵의 모든 에지 점을 유지한다. 적절한 경계값을 지정했기 때문에 얻게 되는 좋은 품질의 외곽선을 갖기 위한 좋은 타협으로 구성한 해결책이다. 이 전략은 이중 경계화라고 하며, 이진 맵을 얻기 위해 두 경계값을 사용함에 기반을 두며, 경계화 작업으로 이진 맵을 반드시 얻어야 하는 어떤 상황에서 사용할 수 있다.

덧붙여 캐니 알고리즘은 이진 맵의 품질을 개선하는 추가 전략으로 사용한다. 이전 이중 경계화 애플리케이션에서 기울기 크기가 에지 방향에서 최대가 아닌 모든 에지 점을 제거한다. 기울기 방향이 항상 에지에 수직임을 상기하자. 그러므로 이 방향으로 기울기의 지역 최대치는 외곽선의 최대 강도에 있는 점에 대응한다. 캐니 외곽선 맵에서 얇은 에지를 얻은 이유를 설명해준다.

Line component feature image extraction

 

target [2] = red; target [1] = green; target [0] = blue; }

// 추출하기 위한 컬러 설정하기

void setTargetColor(cv:: Vec3b color) { target= color; }

|| 추출하기 위한 컬러 가져오기 cv:: Vec3b getTargetColor() const {

return target;

}

이번에는 사용자에게 두 가지로 정의한 setTargetColor 메소드를 함께 제공한다는 점이 흥미롭다. 첫 번째 정의에서는 세 가지 컬러 컴포넌트를 세 가지 인자로 지정하고, 두 번째 정의에서는 컬러값을 갖기 위해 cv:: Vec3b를 사용한다. 다시 말하자면 목표는 클래스 알고리즘 사용을 용이하게 하는 데 있다. 사용자는 요구에 잘 맞는 세터를 간단하게 선택한다.

 


예제 분석

 


일단 전략 디자인 패턴을 사용해 알고리즘을 클래스로 캡슐화했다면 이 클래스의 인스턴스를 생성해 배포할 수 있다. 일반적으로 프로그램을 초기화하면 인스턴스를 생성한다. 알고리즘의 파라미터 기본 값을 읽고 나타낼 수 있다. GUI인 애플리케이션의 경우라면 파라미터 값을 읽을 수 있고, 사용자가 그 값을 갖고 쉽게 다루기 위해 다른 위젯(텍스트필드, 슬라이더 등)을 사용해 설정할 수도 있다. 하지만 GUI(3장의 뒷부분에서 실행한다)를 소개하기 전에 컬러 추출 알고리즘을 실행하는 간단한 메인 함수를 먼저 작성해보자.

 


image processing class implementation 영상처리 클래스 구현

 

 

방법 평균 시간 67ms Matlterator.at(j,i)80ms 29ms3가지 채널을 처리하는 반복문

우선 ‘포인터로 영상 조회’ 절의 부연 설명에서 기술했던 컬러 감축 계산(1-4번째 행)의 세 가지를 비교한다. 예상했던 대로 비트 연산자를 사용한 버전이 실행 시간 35ms로 가장 빠르다. 정수로 나눔을 사용했던 버전은 37ms였다. 나머지를 사용한 버전은 52ms다. 가장 빠른 버전과 가장 느린 버전은 거의 50% 차이를 보여줬다! 그러므로 영상 반복문 내 결과를 계산함에 있어 가장 효율적인 방법을 선택하는 시간을 가져야 할 필요가 있다. 그만큼 결과에 미치는 영향이 아주 중요하다. 내부 공간 처리(5번째 행) 대신 재할당을 지정한 결과 영상이라면 실행 시간은 44ms다. 추가된 작업 시간은 메모리 할당에 따른 오버헤드를 보여준다,

반복문에서 미리 계산한 값을 반복해서 계산하는 작업을 피해야 한다. 분명히 시간을 소모한다. 예를 들어 컬러 감축 함수에서 내부 반복문을 다음과 같이 바꾸는 경우라면

int nc= image.cols * image.channels(); for (int i=0; i<nc; i++) {

다음과 같이 수정한다.

for (int i=0; i<image.cols * image.channels(); i++) {

각 줄에 있는 요소의 총 개수를 매번 계산해야 하는 반복문이다. 35ms의 원버전(6번째 행)보다 80% 정도 매우 느린 65ms라는 실행 시간이 나온다.

 

 

 

single turn design concept 싱글턴 디자인 패턴 사용

 

 


싱글턴은 클래스 인스턴스 접근을 용이하게 하며, 또한 프로그램이 실행하는 동안 해당 클래스의 인스턴스가 하나만 존재함을 보장하는 다른 인기 있는 디자인 패턴이다. 이 예제에서는 컨트롤러 객체에 접근하기 위해 싱글턴을 사용한다.


준비


이전 예제의 ColorDetectController 클래스를 사용한다. 싱글턴 클래스를 얻기 위해 수정한다.

 


예제 구현

 


처음에 할 일은 단일 클래스 인스턴스에 대한 참조를 갖는 private 정적 멤버 변수를 추가한다. 또한 클래스 인스턴스의 추가를 막으려면 생성자를 private으로 만든다.

class ColorDetectController { private: // 싱글턴에 대한 포인터 static ColorDetectController *singleton; ColorDetector *cdetect; // private 생성자 ColorDetectController() { // 애플리케이션 설정 cdetect= new ColorDetector(); }

또한 복사 생성자와 싱글턴 고유 인스턴스의 복사본을 생성하지 못하게 하는 operator=를 만들 수 있다. 클래스를 사용하는 사용자가 클래스의 인스턴스가 필요할 때마다 명령을 내리면 싱글턴 객체가 만들어진다.

 

반복자로 영상을 조회하는 예제에서 설명했던 반복자(7번째 행)를 사용한 컬러감축 함수 버전에서는 67ms인 느린 결과로 나온다. 반복자의 주요 목적은 영상조회 과정을 단순화시키되 오류를 쉽게 발생하는 부분을 줄임에 있다. 하지만영상 조회 과정을 최적화하지는 않는다.

이전 절의 마지막에 소개했던 at 메소드를 사용해 구현한 것은 훨씬 느리다(8번째 행), 실행 시간이 80ms다. 영상 화소에 임의로 접근하는 데 사용할 수 있지만, 영상을 조회할 땐 절대 그렇지 않다.

몇 가지 구문으로 구성된 짧은 반복문은 일반적으로 단일 구문으로 길게 조회하는 것보다 더욱 효율적이다. 처리 요소의 총 개수가 동일한 경우에도 마찬가지다. 마찬가지로 화소에 적용할 N개의 다른 계산 방법이 있다면 N개의 연속적인 반복문을 작성하는 대신 한 반복문에서 계산 방법 중 하나를 적용한다.반복문을 선호한다면 짧은 계산을 하는 반복문을 이용해 작업을 많이 한다. 예를 들어 내부 반복문에서 세 가지 채널을 처리할 수 있으며, 열 개수마다 반복한다면 요소의 총 개수만큼 반복(화소 개수를 세 번씩이나)하는 원래 버전을 사용하는걸로 대신하자. 컬러 감축 공식은 다음과 같이 작성한다(아주 빠른 버전이다).

void colorReduce (cv:: Mat &image, int div=64) {

int nl= image.rows; // 행 개수int nc= image.cols ; // 열 개수// 연속된 영상인가if (image.isContinuous()) {

// 그러면 채울 화소가 없다면nc= nc*nl;nl= 1; // 지금은 1차원 배열

int n= static_cast<int>(

log (static_cast<double> (div) ) /log (2.0));// 화소값을 반올림할 때 사용하는 마스크uchar mask= 0xFF<<n; // 예를 들어 div=16, mask= 0xF0// 모든 화소를 대상으로



how to handle image pixel technique 이미지 그래픽 화소 다루는 방법

 

cv::imshow ("Output Result", Color DetectController::getInstance () ->getLastResult()); }

그리고 애플리케이션이 종료되면 싱글턴 인스턴스는 반드시 릴리즈돼야 한다.

// 'Close' 버튼에 대한 메소드 콜백 void onClose() { // 싱글턴 릴리즈 ColorDetectController::getInstance () ->destroy(); OnOK(); }

여기서 보듯 컨트롤러가 싱글턴 내부에 캡슐화되면 어떠한 클래스에서는 인스턴스에 대한 접근이 쉬워진다. 하지만 매우 만만치 않은 애플리케이션은 더욱 정교한 GUI가 필요하다. 다음 예제에서 모델뷰컨트롤러 구조를 제시함으로써 애플리케이션 설계 시의 패턴 사용법을 설명한다.

* 애플리케이션 설계 위한 모델 뷰 컨트롤러 구조 사용

이전 예제에서는 세 가지 중요한 디자인 패턴인 전략, 컨트롤러, 싱글턴 패턴을 찾아 보여줬다. 이번 예제는 세 가지 패턴을 각 클래스 간의 결합에 사용하는 구조적 패턴을 소개한다. 이것은 모델뷰컨트롤러 또는 MVC로, 사용자 인터페이스에서 애플리케이션 로직을 명확하게 분리하는 애플리케이션을 개발하는데 목표가 있다. 이번 예제에서는 Qt를 사용해 GUI 기반 애플리케이션을 구축하기 위한 MVC 패턴을 사용한다. 그러나 작업에 들어가기 전에 패턴에 대해 간략하게 설명한다.