Main Content

이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.

imquantize

지정된 양자화 수준 및 출력값을 사용하여 영상 양자화

설명

예제

quant_A = imquantize(A,levels)N개 요소 벡터 levels에 포함된 지정된 양자화 값을 사용하여 영상 A를 양자화합니다. 출력 영상 quant_AA와 크기가 같으며, 범위 1 ~ N + 1에 있는 N + 1개의 이산 정수 값을 포함하며 이는 다음 기준에 따라 결정됩니다.

  • A(k) ≤ levels(1)이면 quant_A(k) = 1입니다.

  • levels(m-1) < A(k) ≤ levels(m)이면 quant_A(k) = m입니다.

  • A(k) > levels(N)이면 quant_A(k) = N + 1입니다.

imquantize는 다음과 같은 두 개의 묵시적으로 정의된 끝 구간에 값을 할당합니다.

  • A(k) ≤ levels(1)

  • A(k) > levels(N)

예제

quant_A = imquantize(___,values)N + 1개 요소 벡터 values를 더합니다. 여기서 N = length(levels)입니다. valuesN + 1개 요소 각각은 quant_A에 있는 N + 1개의 이산 픽셀 값의 양자화 값을 지정합니다.

  • A(k) ≤ levels(1)이면 quant_A(k) = values(1)입니다.

  • levels(m-1) < A(k) ≤ levels(m)이면 quant_A(k) = values(m)입니다.

  • A(k) > levels(N)이면 quant_A(k) = values(N + 1)입니다.

예제

[quant_A,index] = imquantize(___)

quant_A = values(index)

가 되도록 하는 배열 index를 반환합니다.

예제

모두 축소

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

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

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

영상의 이산 수준 개수를 256에서 8로 줄입니다. 이 예제에서는 서로 다른 두 가지 방법을 사용하여 8개 출력 수준 각각에 값을 할당합니다.

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

I = imread('coins.png');
imshow(I) 
axis off
title('Grayscale Image')

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

multithresh 함수로 7개의 임계값을 구하여 영상을 8개 수준으로 분할합니다.

thresh = multithresh(I,7);

각 양자화 구간의 최댓값이 출력 영상의 8개 수준에 할당되도록 valuesMax 벡터를 생성합니다.

valuesMax = [thresh max(I(:))]
valuesMax = 1x8 uint8 row vector

    65    88   119   149   169   189   215   255

[quant8_I_max, index] = imquantize(I,thresh,valuesMax);

마찬가지로, 각 양자화 구간의 최솟값이 출력 영상의 8개 수준에 할당되도록 valuesMin 벡터를 생성합니다. 벡터 valuesMin을 사용하여 다시 imquantize를 호출하는 대신, 출력 인수 인덱스를 사용하여 값을 출력 영상에 할당합니다.

valuesMin = [min(I(:)) thresh]
valuesMin = 1x8 uint8 row vector

    23    65    88   119   149   169   189   215

quant8_I_min = valuesMin(index);

8 수준 출력 영상 두 개를 나란히 표시합니다.

imshowpair(quant8_I_min,quant8_I_max,'montage') 
title('Minimum Interval Value           Maximum Interval Value')

Figure contains an axes object. The axes object with title Minimum Interval Value Maximum Interval Value contains an object of type image.

입력 인수

모두 축소

입력 영상으로, 임의 차원의 숫자형 배열로 지정됩니다.

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

양자화 수준으로, N개 요소 벡터로 지정됩니다. 이산 양자화 수준의 값은 단조 증가하는 순서여야 합니다.

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

양자화 값으로, N+1개 요소 벡터로 지정됩니다.

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

출력 인수

모두 축소

양자화된 출력 영상으로, A와 크기가 같은 숫자형 배열로 반환됩니다. 입력 인수 values가 지정된 경우 quant_A는 values와 같은 데이터형입니다. values가 지정되지 않은 경우 quant_A는 double형 클래스입니다.

매핑 배열로, 입력 영상 A와 크기가 같은 배열로 반환됩니다. 매핑 배열에는 정수 인덱스가 포함되며, 이 인덱스로 values에 액세스하여 출력 영상 quant_A = values(index)를 생성합니다. 입력 인수 values가 정의되지 않은 경우 index = quant_A입니다.

데이터형: double

확장 기능

GPU 코드 생성
GPU Coder™를 사용하여 NVIDIA® GPU용 CUDA® 코드를 생성할 수 있습니다.

버전 내역

R2012b에 개발됨

모두 확장

참고 항목

| |