2013-02-07 5 views
1

흰색/검은 색 이미지가 있습니다. 이 이미지의 흰색 픽셀에 가우스 필터를 적용하고 싶습니다. 그러나 다른 픽셀에 다른 Gaussian 대역폭 매개 변수를 지정하려면 픽셀 단위로 적용하고 싶습니다.matlab에서 이미지의 단일 픽셀에 가우스 필터를 적용하는 방법은 무엇입니까?

예를 들어 이미지의 2 픽셀 만 흰색이고 다른 것은 검정색입니다. 이 두 픽셀에 다른 가우스 필터를 적용하고 싶습니다. X [2]와 Y [2]가 2 픽셀의 좌표라고 가정 해 봅시다.

Gaussian bandwidth for X[0] and Y[0] is [10, 10], standard deviation is 1. 
Gaussian bandwidth for X[1] and Y[1] is [20, 20], standard deviation is 3. 

roifilt2는 ROI에서 작동하지만 롤백은 단일 픽셀이 아닌 이미지 영역에만 적용되는 것으로 알고 있습니다. 투자 수익 (ROI) 처리를 확인한 후에 필자의 이해로 코딩했으나 아래 코드는 오류가 발생합니다.

Error using imwrite (line 422) 
Image data can not be empty. 

Error in guassianFilter (line 73) 
    imwrite(out,[outdir,imname,'.png'],'png'); 

필터링 된 출력 이미지가 비어있는 것 같습니다. 하지만 저는 matlab에 익숙하지 않습니다. 왜 이런 일이 일어나고 어떻게 수정해야하는지 모르겠습니다. :(

내가 직접 일을 호출 할 수있는 MATLAB 함수 있나요

코드 :

while ischar(tline) 
     line = regexp(tline,' ','split'); 
     if(strcmp(line{1},'touch') == 1) 
      c = floor(str2double(line{1,3})); % same as X[0] as I mentioned above 
      r = floor(str2double(line{1,4})); % same as Y[0] as I mentioned above 
      BW = roipoly(im,c,r); 
      G = fspecial('gaussian',[10 10],1); 
      out = roifilt2(G,im,BW); 
     end 
     if(strcmp(line{1},'dT') == 1) 
      c = floor(str2double(line{1,3})); % same as X[1] as I mentioned above 
      r = floor(str2double(line{1,4})); % same as X[1] as I mentioned above 
      BW = roipoly(im,c,r); 
      G = fspecial('gaussian',[20 20], 3); 
      out = roifilt2(G,im,BW); 
     end 
     tline = fgets(fid); 
    end 
    fclose(fid); 

    imname=strtok(imList(cnt).name,'.'); 
    imwrite(out,[outdir,imname,'.png'],'png'); 

답변

1

작동합니다 아이디어를 개설하기 전에, 내가 코드를 하나의 문제를 관찰하자 roifilt2으로 전화를 걸면 파일에서 읽은 각 단일 픽셀 명령어의 결과가 out임을 덮어 씁니다. 결과 이미지가 비어있는 다른 버그를 발견하더라도 결과는 결코 사라지지 않습니다. 합성물.

어때? 먼저 파일에서 모든 픽셀 위치와 해당 대역폭을 읽고이 좌표만으로 두 번 스트로크하여 필터링 된 이미지를 재구성 할 수 있습니다. 픽셀 목록을 읽기 xy가 위치하며, sig는 대역폭이

fid = fopen('points.txt'); 
pxl = struct('x', {}, 'y', {}, 'sig', {}); 
n_pxl = 0; 
tline = fgets(fid); 
while ischar(tline) 
    line = regexp(tline,' ','split'); 
    n_pxl = n_pxl + 1; 
    pxl(n_pxl).x = floor(str2double(line{1,3})); 
    pxl(n_pxl).y = floor(str2double(line{1,4})); 
    if strcmp(line{1},'touch') == 1 
     pxl(n_pxl).sig = 1; 
    elseif strcmp(line{1},'dT') == 1 
     pxl(n_pxl).sig = 3; 
    else 
     pxl(n_pxl).sig = nan; 
    end 
    tline = fgets(fid); 
end 
fclose(fid); 

처럼 보일 수 있습니다. WIDTHHEIGHT이 이미지의 크기라고 가정하면 합성 결과 이미지를 out = zeros(HEIGHT, WIDTH); 플랫으로 초기화 할 수 있습니다. 필터 크기에 대한 조회 벡터는 flt_size = [10, 15, 20]; 일 수 있습니다. sig = [1, 3] 위에 일부 for -loop에서는 오버레이 각각 "슬라이드"를 생성, 필터 연산의 결과와 복합체를 특정 시그마

im_raw = zeros(HEIGHT, WIDTH); 
for k = find([pxl.sig] == sig) 
    im_raw(pxl(k).y, pxl(k).x) = 1; 
end 

에 대응하는 모든 픽셀을 수집하고 증가 후

fsz = flt_size(sig); 
out = out + conv2(im_raw, fspecial('gaussian', [fsz, fsz], sig), 'same'); 
함께 찍은

, 루프이 맘에 수 것 :

out = zeros(HEIGHT, WIDTH); 
flt_size = [10, 15, 20]; 
for sig = [1, 3] 
    im_raw = zeros(HEIGHT, WIDTH); 
    for k = find([pxl.sig] == sig) 
     im_raw(pxl(k).y, pxl(k).x) = 1; 
    end 
    fsz = flt_size(sig); 
    out = out + conv2(im_raw, fspecial('gaussian', [fsz, fsz], sig), 'same'); 
end 

을 보여주기위한 약간 더 큰 대역폭을 사용하여, 시간 각 카테고리의 두 점에 대한 예입니다. 왼쪽과 가운데 이미지는 각 "슬라이드"를 보여주고 오른쪽 이미지는 합성 이미지를 보여줍니다. 각 이미지는 imagesc으로 조정되어 표시됩니다.

Example

+0

대단히 감사합니다. 이해하기에 너무 명확한 시간과 노력에 감사드립니다. – Jasmine

관련 문제