Main Content

multithresh

오츠 방법을 사용한 다중 수준 영상 이진화

설명

예제

thresh = multithresh(A)는 오츠 방법을 사용하여 영상 A에 대해 계산한 단일 임계값 thresh를 반환합니다. threshimquantize에 대한 입력 인수로 사용하여 영상을 2수준(이진) 영상으로 변환할 수 있습니다.

예제

thresh = multithresh(A,N)은 오츠 방법을 사용하여 N개의 임계값을 포함하는 1×N 벡터인 thresh를 반환합니다. threshimquantize에 대한 입력 인수로 사용하여 영상 AN+1개의 이산 수준을 갖는 영상으로 변환할 수 있습니다.

예제

[thresh,metric] = multithresh(___)는 계산된 임계값의 효용성 측정값인 metric을 반환합니다.

예제

모두 축소

영상을 읽어 들인 후 이를 표시합니다.

I = imread('coins.png');
imshow(I)

Figure contains an axes. The axes contains an object of type image.

영상의 단일 임계값을 계산합니다.

level = multithresh(I);

imquantizemultithresh에서 반환되는 임계값 수준을 지정하여 영상을 두 개 영역으로 분할합니다.

seg_I = imquantize(I,level);
figure
imshow(seg_I,[])

Figure contains an axes. The axes contains an object of type image.

영상을 읽어 들인 후 이를 표시합니다.

I = imread('circlesBrightDark.png');
imshow(I)
axis off
title('Original Image')

Figure contains an axes. The axes with title Original Image contains an object of type image.

두 개의 임계값 수준을 계산합니다.

thresh = multithresh(I,2);

imquantize를 사용하여 영상을 3개의 수준으로 분할합니다.

seg_I = imquantize(I,thresh);

label2rgb를 사용하여 분할된 영상을 컬러 영상으로 변환한 후 이를 표시합니다.

RGB = label2rgb(seg_I); 	 
figure;
imshow(RGB)
axis off
title('RGB Segmented Image')

Figure contains an axes. The axes with title RGB Segmented Image contains an object of type image.

트루컬러(RGB) 영상을 읽어 들인 후 이를 표시합니다.

I = imread('peppers.png');
imshow(I) 
axis off
title('RGB Image');

Figure contains an axes. The axes with title RGB Image contains an object of type image.

전체 RGB 영상에서 7개 수준에 대한 임계값을 생성합니다.

threshRGB = multithresh(I,7);

RGB 영상의 각 평면에 대해 임계값을 생성합니다.

threshForPlanes = zeros(3,7);			

for i = 1:3
    threshForPlanes(i,:) = multithresh(I(:,:,i),7);
end

전체 영상에서 계산된 임계값 집합으로 전체 영상을 처리합니다.

value = [0 threshRGB(2:end) 255]; 
quantRGB = imquantize(I, threshRGB, value);

지정된 평면에서 계산된 임계값 벡터를 사용하여 각 RGB 평면을 개별적으로 처리합니다. 해당 평면에 대해 생성된 임계값 벡터를 사용하여 각 RGB 평면을 양자화합니다.

quantPlane = zeros( size(I) );

for i = 1:3
    value = [0 threshForPlanes(i,2:end) 255]; 
    quantPlane(:,:,i) = imquantize(I(:,:,i),threshForPlanes(i,:),value);
end

quantPlane = uint8(quantPlane);

포스터화된 영상을 모두 표시한 후 두 이진화 방식의 시각적 차이를 확인합니다.

imshowpair(quantRGB,quantPlane,'montage') 
axis off
title('Full RGB Image Quantization        Plane-by-Plane Quantization')

Figure contains an axes. The axes with title Full RGB Image Quantization Plane-by-Plane Quantization contains an object of type image.

결과를 비교하려면 각 출력 영상에서 고유한 RGB 픽셀 벡터의 개수를 계산하십시오. 평면별 이진화 방식은 전체 RGB 영상 이진화 방식보다 23% 많은 색을 생성함을 알 수 있습니다.

dim = size( quantRGB );
quantRGBmx3   = reshape(quantRGB,   prod(dim(1:2)), 3);
quantPlanemx3 = reshape(quantPlane, prod(dim(1:2)), 3);

colorsRGB   = unique(quantRGBmx3,   'rows' );
colorsPlane = unique(quantPlanemx3, 'rows' );

disp(['Unique colors in RGB image            : ' int2str(length(colorsRGB))]);
Unique colors in RGB image            : 188
disp(['Unique colors in Plane-by-Plane image : ' int2str(length(colorsPlane))]);
Unique colors in Plane-by-Plane image : 231

영상을 읽어 들입니다.

I = imread('circlesBrightDark.png');

영상에서 고유한 회색조 값을 모두 찾습니다.

uniqLevels = unique(I(:));  

disp(['Number of unique levels = ' int2str( length(uniqLevels) )]);
Number of unique levels = 148

단조 증가하는 N 값에서 일련의 임계값을 계산합니다.

Nvals = [1 2 4 8];
for i = 1:length(Nvals)
    [thresh, metric] = multithresh(I, Nvals(i) );
    disp(['N = ' int2str(Nvals(i)) '  |  metric = ' num2str(metric)]);
end
N = 1  |  metric = 0.54767
N = 2  |  metric = 0.98715
N = 4  |  metric = 0.99648
N = 8  |  metric = 0.99902

imquantize를 사용하여 9개의 수준을 갖는 분할 결과를 얻으려면 8개의 임계값 세트를 적용하십시오.

seg_Neq8 = imquantize(I,thresh);
uniqLevels = unique( seg_Neq8(:) )
uniqLevels = 9×1

     1
     2
     3
     4
     5
     6
     7
     8
     9

seg_Neq8multithresh에 대한 입력값으로 사용하여 영상을 이진화합니다. N을 이 분할된 영상의 수준 수보다 1이 적은 8로 설정합니다. multithreshmetric 값 1을 반환합니다.

[thresh, metric] = multithresh(seg_Neq8,8)
thresh = 1×8

    1.8784    2.7882    3.6667    4.5451    5.4549    6.3333    7.2118    8.1216

metric = 1

이번에는 N 값을 1만큼 증가시켜 영상을 다시 이진화합니다. 이제 N 값은 영상의 수준 수와 동일합니다. 요청된 임계값 개수에 비해 영상의 수준 수가 너무 적기 때문에 입력값은 퇴화 입력값입니다. 따라서 multithresh는 metric 값 0을 반환합니다.

[thresh, metric] = multithresh(seg_Neq8,9)
Warning: No solution exists because the number of unique levels in the image are too few to find 9 thresholds. Returning an arbitrarily chosen solution.
thresh = 1×9

     1     2     3     4     5     6     7     8     9

metric = 0

입력 인수

모두 축소

이진화할 영상으로, 임의 차원의 숫자형 배열로 지정됩니다. multithresh는 전체 배열의 집계된 히스토그램에 기반하여 임계값을 구합니다. multithresh는 RGB 영상을 3차원 숫자형 배열로 간주하고 3개의 색 평면 모두에서 결합된 데이터의 임계값을 계산합니다.

multithresh는 입력 영상 A의 범위 [min(A(:)) max(A(:))]을 후속 계산에서 사용되는 히스토그램을 계산할 때의 제한값으로 사용합니다. multithresh는 계산 시 모든 NaNs를 무시합니다. Infs-Infs는 히스토그램의 첫 번째 Bin과 마지막 Bin에서 각각 계산됩니다.

A의 고유한 값 개수가 N보다 작거나 같은 퇴화(degenerate) 입력값의 경우, 오츠 방법을 사용해서는 유효한 해를 구할 수 없습니다. 이러한 입력값의 경우에는 반환 값 threshA의 고유한 값이 모두 포함되며, 임의로 선택된 몇 개의 추가 값도 포함될 수 있습니다.

데이터형: single | double | int16 | uint8 | uint16

임계값 개수로, 양의 정수로 지정됩니다. N > 2인 경우, multithresh는 오츠 기준의 탐색 기반 최적화를 사용하여 임계값을 구합니다. 탐색 기반 최적화는 국소적으로 최적인 결과만 보장합니다. N을 사용하여 국소 최적해로 수렴할 가능성을 높일 수 있으므로, 더 작은 N 값을 사용하는 것이 좋습니다(일반적으로 N < 10). N에 허용되는 최댓값은 20입니다.

데이터형: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

출력 인수

모두 축소

영상을 양자화하는 데 사용되는 임계값의 집합으로, 영상 A와 데이터형이 동일한 1×N 숫자형 벡터로 반환됩니다.

범위 [0, 1]의 정규화된 임계값을 반환하는 graythresh 함수와 달리, 이 임계값은 입력 영상 A와 같은 범위에 있습니다.

임계값의 효용성 측정값으로, [0, 1] 범위의 숫자로 반환됩니다. 값이 클수록 오츠의 객관적 기준에 따라 입력 영상을 N+1개의 클래스로 분할할 때 임계값의 효용성이 높은 것입니다. A의 고유값 개수가 N보다 작거나 같은 퇴화 입력값의 경우, metric은 0입니다.

데이터형: double

참고 문헌

[1] Otsu, N., "A Threshold Selection Method from Gray-Level Histograms," IEEE Transactions on Systems, Man, and Cybernetics, Vol. 9, No. 1, 1979, pp. 62-66.

확장 기능

참고 항목

| | |

R2012b에 개발됨