2014-06-17 3 views
-1
% OTSU THRESHOLDING 
% X=imread('cameraman.tif') 
% a=ones(256,1)*[1:256]; 
% c2=double(X).*(a/2+50)+(1-double(X)).*a/2; 
% c3=uint8(255*mat2gray(c2)); 
% IDX = otsu(c3,2); 
%---------------------------------------------------------- 
% 
% function [IDX,sep] = otsu(I,n) 

I = single(I); 

    %% Convert to 256 levels 
    I = I-min(I(:)); 
    I = round(I/max(I(:))*255); 

    %% Probability distribution 
    unI = sort((I)); 
    nbins = min(length(unI),256); 

    [histo,pixval] = hist(I(:),256); 

    P = histo/sum(histo); 


    %% Zeroth- and first-order cumulative moments 
    w = cumsum(P); 
    mu = cumsum((1:nbins).*P); 

    %% Maximal sigmaB^2 and Segmented image 
    if n==2 
     sigma2B =... 
      (mu(end)*w(1:end-1)-mu(1:end-1)).^2./w(1:end-1)./(1-w(1:end-1)); 

     [maxsig,k] = max(sigma2B); 
     k 

이것은 오츠 임계 값 (2 클래스 만)을 찾는 데 사용하는 코드입니다. 그래서 최적의 임계 값 즉 k를 찾은 후 임계 값 이미지를 계산하는 방법 ?? 각 이미지 픽셀 값을 변경하는 방법 < k = 0 및> = k = 1 그러면 이진 이미지가 생성됩니까?히스토그램 임계 값에서 플로팅

답변

0

임계 값 k이 주어지면 이진 연산을 사용하여 임계화된 이미지를 계산할 수 있습니다.

단순히 I이 이미지 인 경우, 역치 영상과 같이 계산 될 수 넣어 :

outThreshold = I >= k; 

또한 사용할 수있는 동일한 작업 할 것입니다 outThreshold = im2bw(I,k); (감사 @Daniel를!). 기본적으로 위에서 설명한 내용을 본질적으로 수행합니다. 어떤 경우

,이 반환 이진지도 곳보다 크거나 미만이다 k 것과 false/0가 설정되는 동안 true/1 설정 얻을 k 같다 강도가 픽셀. 다음은 graythresh을 사용한 예입니다. MATLAB에는 Otsu를 사용하여 graythresh에 의해 내장 된 임계 값 찾기 알고리즘이 있습니다.

I = imread('cameraman.tif'); %// Built-in to MATLAB - A grayscale image 
k = 255*graythresh(im); %// Output is scaled between 0 - 1. 
         %//Multiply by 255 to get 8-bit intensity 
subplot(1,2,1); 
imshow(I); 
outThresh = I >= k; 
subplot(1,2,2); 
imshow(outThresh); 

는, 당신은이 그림을 얻을 : 검은 색 위치가 그렇지 않은 사람들을 동안 임계 값을 능가하는 픽셀 흰색 나타낸다입니다

enter image description here

위치를.

의견에서

, 당신은 다중 임계 값을 수행하는 방법을 추구하고자하는 (당신은 정말 그냥 게시물을 업데이트해야한다). 이것은 여전히 ​​매우 간단합니다.

thresholds = [32 96 128 192]; 

이것이 말하는 것은 다섯 지역은 우리가 고려할 필요가 있다는 것입니다 : 0 사이의 강도 값

  • 픽셀을 31
  • 당신을 가정 할 것은 이렇게 같은 임계 값의 배열을했다
  • 명암 값이 32에서 95 사이 인 픽셀
  • 96에서 127 사이의 명도 값을 갖는 픽셀
  • 픽셀 명도 va 매독 강도 값
  • 191-128 사이의 픽셀이 예를 들어, 상부 단부가 배타적 것을

255-192 사이에 유의해야한다. 따라서 종료 간격은 포함하지 않지만 다음 간격에이 숫자를 포함시키고이를 간격의 하단으로 지정합니다.

for 루프를 사용하고 각 범위 내의 모든 픽셀을 찾아 ID 번호로 설정하는 지도 변수를 만들면됩니다.이 모든 ID를 순서대로 증가 시키십시오. 그러면 첫 번째 영역에 ID가 1, 다음에 ID가 할당되고 ID가 2 등으로 할당됩니다. 이 그것을 할 것입니다 코드입니다 :

map = zeros(size(I)); 

thresholdArray = [0 thresholds 255]; 

for k = 1 : numel(thresholdArray)-1 
    lower = thresholdArray(k); 
    upper = thresholdArray(k+1); 

    map(I >= lower & I < upper) = k; 
end 

%// Rescale to 0 - 255 
outMap = uint8(255*(map - min(map(:)))/(max(map(:)) - min(map(:)))); 

figure; 
subplot(2,2,1); 
imshow(I); 
subplot(2,2,2); 
imhist(I); 
subplot(2,2,3); 
imshow(outMap); 
subplot(2,2,4); 
imhist(outMap); 

이 출력 모습입니다 같은 :

enter image description here

코드는 다중 임계 값,뿐만 아니라 막대 그래프와 원본 이미지를 표시하는 수행 히스토그램이있는 임계 값 이미지뿐입니다. 출력 맵의 크기를 0에서 255로 변경했습니다. 따라서 클래스에는 (256/numThresholds)의 값이 할당됩니다. 이 경우, 64

+0

Plz은을 사용하여 흑백 이미지로 이미지 I 변환입니다 ..이 multithresh 가능한 것입니까? – bcool93

0

im2bw(I,p) 위 내 의견을보고 몇 가지 방법을 제안 임계 P

+0

나는 'for loop'과 'if conditions'을 사용하여 논리 알고리즘이 더 유사 할 것으로 예상했다. 왜냐하면 2/3 임계 값을 갖고 3/4 클래스 임계 값 이미지를 작성해야한다면 어떻게해야 할까? 또한 u를 실행하는 경우에만 볼 수 있도록 임계화된 이미지를 업로드 할 수 있습니다. 넣어두면 IDX = 0 (크기 (I)); IDX (I> = pixval (k)) = 1; 그림; imagesc (IDX); 제목 ([pixval (k) k]); 축 이미지 끄기; 색상 맵 (회색); 이미지를 이진 형식으로 바꾸지 않고 있지만 왜 그래야하는지 알 수 있습니다. 그림; hist (IDX); 다양한 값의 여러 가지 히스토그램을 제공합니까 ?? & @rayryeng – bcool93

+0

지금까지 도와 주셔서 감사합니다. :) & @rayryeng .. – bcool93

+0

@ bcool93 - 귀하의 게시물에 명확하지 않았습니다. 당신은 단지 2 클래스의 경우를 원했습니다. 이미지의 다중 임계 값을 지정하려면 이미지에 속한 ** 클래스 **에 해당하는 픽셀을 '1'이 아닌 이미지 픽셀로 설정해야합니다. '0/1'은 바이너리를위한 것입니다. 그에 따라 내 게시물을 수정합니다. – rayryeng