multithresh
오츠 방법을 사용한 다중 수준 영상 이진화
설명
는 오츠 방법을 사용하여 영상 thresh
= multithresh(A
)A
에 대해 계산한 단일 임계값 thresh
를 반환합니다. thresh
를 imquantize
에 대한 입력 인수로 사용하여 영상을 2수준(이진) 영상으로 변환할 수 있습니다.
은 오츠 방법을 사용하여 thresh
= multithresh(A
,N
)N
개의 임계값을 포함하는 1×N
벡터인 thresh
를 반환합니다. thresh
를 imquantize
에 대한 입력 인수로 사용하여 영상 A
를 N+1
개의 이산 수준을 갖는 영상으로 변환할 수 있습니다.
예제
영상을 두 개 영역으로 분할하기
영상을 읽어 들여 표시합니다.
I = imread("coins.png");
imshow(I)
영상의 단일 임계값을 계산합니다.
level = multithresh(I);
imquantize
함수에 multithresh
함수에서 반환되는 임계값 수준을 지정하여 영상을 두 개 영역으로 분할합니다. 결과를 표시합니다.
seg_I = imquantize(I,level); imshow(seg_I,[])
두 개의 임계값을 사용하여 영상을 3개의 수준으로 분할하기
영상을 읽어 들인 후 회색조 영상으로 변환하고 결과를 표시합니다.
I = imread("foggysf2.jpg"); I = rgb2gray(I); imshow(I) title("Grayscale Image")
두 개의 임계값 수준을 계산합니다.
thresh = multithresh(I,2);
imquantize
함수를 사용하여 영상을 3개의 수준으로 분할합니다.
labels = imquantize(I,thresh);
label2rgb
함수를 사용하여 분할된 영상을 컬러 영상으로 변환한 후 이 영상을 표시합니다.
labelsRGB = label2rgb(labels);
imshow(labelsRGB)
title("Segmented Image")
전체 영상 이진화와 평면별 이진화 비교하기
RGB 영상을 읽어 들여 표시합니다.
I = imread("peppers.png"); imshow(I) title("RGB 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")
결과를 비교하려면 각 출력 영상에서 고유한 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
metric 출력 인수를 사용하여 결과 확인하기
영상을 읽어 들입니다.
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_Neq8
을 multithresh
에 대한 입력값으로 사용하여 영상을 이진화합니다. N
을 이 분할된 영상의 수준 수보다 1이 적은 8로 설정합니다. multithresh
는 metric
값 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
입력 인수
A
— 이진화할 영상
숫자형 배열
이진화할 영상으로, 임의 차원의 숫자형 배열로 지정됩니다. multithresh
는 전체 배열의 집계된 히스토그램에 기반하여 임계값을 구합니다. multithresh
는 RGB 영상을 3차원 숫자형 배열로 간주하고 3개의 색 평면 모두에서 결합된 데이터의 임계값을 계산합니다.
multithresh
는 입력 영상 A
의 범위 [min(A(:)) max(A(:))]
을 후속 계산에서 사용되는 히스토그램을 계산할 때의 제한값으로 사용합니다. multithresh
는 계산 시 모든 NaNs
를 무시합니다. Infs
와 -Infs
는 히스토그램의 첫 번째 Bin과 마지막 Bin에서 각각 계산됩니다.
A
의 고유한 값 개수가 N
보다 작거나 같은 퇴화(degenerate) 입력값의 경우, 오츠 방법을 사용해서는 유효한 해를 구할 수 없습니다. 이러한 입력값의 경우에는 반환 값 thresh
에 A
의 고유한 값이 모두 포함되며, 임의로 선택된 몇 개의 추가 값도 포함될 수 있습니다.
데이터형: single
| double
| int16
| uint8
| uint16
N
— 임계값 개수
1
(디폴트 값) | 양의 정수
임계값 개수로, 양의 정수로 지정됩니다. N > 2
인 경우, multithresh
는 오츠 기준의 탐색 기반 최적화를 사용하여 임계값을 구합니다. 탐색 기반 최적화는 국소적으로 최적인 결과만 보장합니다. N
을 사용하여 국소 최적해로 수렴할 가능성을 높일 수 있으므로, 더 작은 N
값을 사용하는 것이 좋습니다(일반적으로 N < 10
). N
에 허용되는 최댓값은 20입니다.
데이터형: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
출력 인수
thresh
— 임계값의 집합
1×N
숫자형 벡터
영상을 양자화하는 데 사용되는 임계값의 집합으로, 영상 A
와 데이터형이 동일한 1×N
숫자형 벡터로 반환됩니다.
[0, 1] 범위의 정규화된 임계값을 반환하는 graythresh
함수와 달리, 이 임계값은 입력 영상 A
와 같은 범위에 있습니다.
참고 문헌
[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.
확장 기능
C/C++ 코드 생성
MATLAB® Coder™를 사용하여 C 코드나 C++ 코드를 생성할 수 있습니다.
사용법 관련 참고 및 제한 사항:
multithresh
함수는 C 코드 생성을 지원합니다(MATLAB® Coder™가 필요함). 일반적인MATLAB Host Computer
타깃 플랫폼을 선택할 경우multithresh
함수는 미리 컴파일된 플랫폼별 공유 라이브러리를 사용하는 코드를 생성합니다. 공유 라이브러리를 사용하면 성능 최적화가 유지되지만 코드를 생성할 수 있는 타깃 플랫폼이 제한됩니다. 자세한 내용은 Types of Code Generation Support in Image Processing Toolbox 항목을 참조하십시오.입력 인수
N
은 컴파일타임 상수여야 합니다.
GPU 코드 생성
GPU Coder™를 사용하여 NVIDIA® GPU용 CUDA® 코드를 생성할 수 있습니다.
사용법 관련 참고 및 제한 사항:
입력 인수
N
은 컴파일타임 상수여야 합니다.
버전 내역
R2012b에 개발됨
참고 항목
MATLAB 명령
다음 MATLAB 명령에 해당하는 링크를 클릭했습니다.
명령을 실행하려면 MATLAB 명령 창에 입력하십시오. 웹 브라우저는 MATLAB 명령을 지원하지 않습니다.
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)