|
임계값 |
작성일 : 2011-11-14 |
작성자 : 양승훈 |
다양한 영상 처리를 수행하다 보면 최종적으로 영상 내 픽셀 중에서 특정 값보다 큰 값을 갖는 픽셀만 남기고 나머지 픽셀은 무시하는 작업이 필요한 경우가 있다. 이 경우, OpenCV 에서는 Cv.Threshold() 함수를 사용할 수 있다. 이 함수는 행렬과 임계값이 주어지면, 행렬 내 모든 원소값을 임계값과 비교하여 지정된 연산을 수행한다.
public static void Threshold(CvArr src, CvArr dst, double threshold, double max_value, ThresholdType threshold_type); |
ThresholdType은 원본 영상의 i번째 픽셀값과 임계값을 비교하는 고유의 연산 방식은 갖는다. 입력 픽셀과 임계값 사이의 관계에 따라 결과 영상의 픽셀값 dst는 0,src, 또는 최대값(M, 함수의 인자 max_value와 같다.) 셋 중의 하나로 설정된다.
ThresholdType 값 |
의미 |
ThresholdType.Binary; |
Dst = (src > T) ? M:0 |
ThresholdType.Binary_INV; |
Dst = (src > T) ? 0:M |
ThresholdType.TRUNC; |
Dst = (src > T) ? M:src |
ThresholdType.TOZERO_INV; |
Dst = (src > T) ? 0:src |
ThresholdType.TOZERO; |
Dst = (src > T) ? src:0 |
영상의 세 채널값을 합산하여 그 결과를 임계값 100으로 잘러서 보여준다.
각 채널값을 8비트 영상에 직접 더하면 오버플로우가 발생할 수 있다. Cv.AddWeighted() 함수를 사용하여 세 개의 색상 채널값의 가중 합을 구하고, 그 결과값을 임계값 100으로 잘라내었다. Cv.Threshold() 함수는 8비트 또는 실수형 그레이스케일 입력 영상만 취급한다. 출력 영상은 입력 영상과 동일한 타입이거나 또는 8비트 영상이다.
private void MenuItem_Click_9(object sender, RoutedEventArgs e) { if (src == null) return; IplImage dst = Cv.CreateImage(src.Size, BitDepth.U8, 3); IplImage r = Cv.CreateImage(Cv.GetSize(src), BitDepth.U8, 1); IplImage g = Cv.CreateImage(Cv.GetSize(src), BitDepth.U8, 1); IplImage b = Cv.CreateImage(Cv.GetSize(src), BitDepth.U8, 1);
//입력 영상을 r,g,b 색 평면으로 분할 Cv.Split(src, r, g, b, null);
//임시저장용 IplImage s = Cv.CreateImage(Cv.GetSize(src), BitDepth.U8, 1);
Cv.AddWeighted(r,1/3,g,1/3,0.0,s); Cv.AddWeighted(s,2/3,b,1/3,0.0,s);
//100보다 큰 픽셀의 값을 모두 100으로 설정 Cv.Threshold(s, s, 100, 100, ThresholdType.Truncate);
//Cv.CvtColor(src, dst, ColorConversion.BgraToGray); Cv.Merge(r, g, b, null, dst); resultwb = new WriteableBitmap(src.Width, src.Height,96, 96,PixelFormats.Rgb24,null);
WriteableBitmapConverter.ToWriteableBitmap(dst, resultwb);
image2.Source = resultwb; } |
영상의 각 채널을 합하고 임계치를 적용하는 다른 방법
IplImage s = Cv.CreateImage(Cv.GetSize(src), BitDepth.F32, 1); Cv.Zero(s); Cv.Acc(b, s); Cv.Acc(g, s); Cv.Acc(r, s); Cv.Threshold(s, s, 100, 100, ThresholdType.Truncate); |