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 object. The hidden axes object contains an object of type image.

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

level = multithresh(I);

imquantize 함수에 multithresh 함수에서 반환되는 임계값 수준을 지정하여 영상을 두 개 영역으로 분할합니다. 결과를 표시합니다.

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

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

영상을 읽어 들인 후 회색조 영상으로 변환하고 결과를 표시합니다.

I = imread("foggysf2.jpg");
I = rgb2gray(I);
imshow(I)
title("Grayscale Image")

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

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

thresh = multithresh(I,2);

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

labels = imquantize(I,thresh);

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

labelsRGB = label2rgb(labels);
imshow(labelsRGB)
title("Segmented Image")

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

RGB 영상을 읽어 들여 표시합니다.

I = imread("peppers.png");
imshow(I) 
title("RGB Image");

Figure contains an axes object. The hidden axes object 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);

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

montage({quantRGB,quantPlane}) 
title("Full RGB Image Quantization vs. Plane-by-Plane Quantization")

Figure contains an axes object. The hidden axes object with title Full RGB Image Quantization vs. 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");
disp("Unique colors in RGB image: "+length(colorsRGB));
Unique colors in RGB image: 188
colorsPlane = unique(quantPlanemx3,"rows");
disp("Unique colors in plane-by-plane image: "+length(colorsPlane));
Unique colors in plane-by-plane image: 231

영상을 읽어 들입니다.

I = imread('circlesBrightDark.png');

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

uniqLevels = unique(I(:));
disp("Number of unique levels = "+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 = "+Nvals(i)+"  |  metric = "+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 값은 영상의 수준 수와 동일합니다. 요청된 임계값 개수에 비해 영상의 수준 수가 너무 적기 때문에 입력값은 퇴화 입력값입니다. 따라서 multithreshmetric 값 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에 개발됨