2016-10-21 1 views
2

Shai을 기반으로하고 Biguri의 코드와 코멘트,이 같은 컬러 사진을 완료 :부드럽고 하얀 가장자리를 제거하는 방법? 게다가, 왜 내 대답에 검은 선이 생깁니 까? 그것을 해결하는 방법?

enter image description here

문제는 어떻게 흰색 가장자리를 제거하고 부드럽게 만들기 위해 발생? 한 가지 해결책은 3x3 행렬 또는 더 크고 평균을 구축하는 것입니다. 그러나 계산은 모든 화이트 에지 점에 대해 커야합니다. 또는 Matlab에서이 유용한 기능을 사용할 수 있습니까? enter image description here

+0

왜'jpg' 형식으로 이미지를 게시하는? 'jpg' 형식은 유물을 생성하는 [손실 압축] 형식입니다 (https://en.wikipedia.org/wiki/Lossy_compression). 이미지를 'png'형식으로 바꾸십시오. – Rotem

+1

당신은 이것으로 훌륭한 일을하고 있습니다! 깔끔하게, 정말로! 우리가 해답을 읽고 수정할 수있는 시간을 갖게되어서 기쁘다. –

+0

가이드를 가져 주셔서 감사합니다. 그것을 가능하게하는 것은 재미 있습니다. – pring

답변

3

이미지 처리 도구 상자에 대한 라이센스가있는 경우 예를 들어 medfilt2을 사용하여 이미지에 중간 필터를 적용 할 수 있습니다. 11 x 11 중간 값 필터가 트릭을 수행해야합니다. 도구 상자가없는 경우 필터를 직접 다시 구현하는 것은 그리 어렵지 않습니다.

이것은 가능성 중 하나 일 뿐이며, 앵글 에지 제거에 대한 선명도에 미치는 영향이 다른 많은 필터를 사용할 수 있습니다. 편집

: 여기 짧은 메디안 필터 구현 (이것은 에러를 포함 할 수 있고 최적화 될 수있다) :

function ret = imageMedianFilter(im, np) 
if(size(np,2) == 1) 
    npx = np; 
    npy = np; 
else 
    npx = np(1); 
    npy = np(2); 
end 
ret = zeros(size(im,1),size(im,2)); 
for xpos = 1:size(im,1) 
    for ypos = 1:size(im,2) 
     curval = double(0); 
     if(xpos + npx - 1) > size(im,1) 
      npixels_x = size(im,1) - xpos + 1; 
     else 
      npixels_x = npx; 
     end 
     if(ypos + npy - 1) > size(im,2) 
      npixels_y = size(im,2) - ypos + 1; 
     else 
      npixels_y = npy; 
     end 
     a = im(xpos:xpos+npixels_x-1 , ypos:ypos+npixels_y-1); 
     a = reshape(a,1,size(a,1)*size(a,2)); 
     curval = median(a); 
     ret(xpos , ypos) = curval; 
    end 
end 
ret = uint8(ret); 
end 

당신은 R, G 및 B 구성 요소를 사용할 수 이하 로템에서와 같이

RGB = cat(3, imageMedianFilter(RGB(:,:,1), [11,11]), imageMedianFilter(RGB(:,:,2), [11,11]), imageMedianFilter(RGB(:,:,3), [11,11]));

(이미지의 이름이 RGB라고 가정).

+0

'medfilt2'를 시도했는데 결과가 좋지 않습니다. 소스 코드 및 결과 이미지를 게시하십시오. – Rotem

+0

죄송합니다. 실수를했습니다. 11x11은 더 나은 결과를 제공합니다. 안타깝게도 이미지 처리 도구 라이센스가 없으며 재 구현 만합니다. 그렇지 않으면'imgaussfilt'와 같은 가우시안 필터는 괜찮지 만 중앙값 필터보다 가장자리 선명도가 떨어집니다. 그에게 받아 들여질 수있는 것을 선택하는 것은 원래의 포스터까지입니다. –

+1

OK, 작동하지만 R, G 및 B 필터를 별도로 적용해야합니다 : RGB = cat (3, medfilt2 (RGB (:, : 1), [11,11]), medfilt2 (RGB (: , 012, 11,]), medfilt2 (RGB (:, :, 3), [11,11])) ' – Rotem

1

여기 내 해결책이 있습니다. 나는 가까운 RGB를 평균화하기 위해 n * n 패치를 취한다. 그러나 문제가 발생합니다. 처리 된 사진의 오른쪽면이 검은 색 선으로 나타나는 이유는 무엇입니까?

clc;clf;close all;clear all; 
img = imread('sample2color_t1.bmp'); %// read image 
bw = img(:,:,1) > 128; %// convert to binary mask 
[lb,lab] = bwlabel(bw,4); %// extract distinct regions 
[a,b,c]=size(img); 
R=ones(a,b); 
G=ones(a,b); 
B=ones(a,b); 

%I have omitted other colors process codes. Below it is the white edges code. 
r=[];c=[]; 
[r,c] = find(lb ==0); 
for i=1:length(r) 
    R(r(i),c(i))=1; 
    G(r(i),c(i))=1; 
    B(r(i),c(i))=1; 
end 
scale=5;%步长1,8连通 
for i=1:length(r) 
    sumR=0;sumG=0;sumB=0; 
    for j=0:2*scale 
    for k=0:2*scale 
     sumR=sumR+R(r(i)-scale+j,c(i)-scale+k); 
     sumG=sumG+G(r(i)-scale+j,c(i)-scale+k); 
     sumB=sumB+B(r(i)-scale+j,c(i)-scale+k); 
    end 
    end 
    R(r(i),c(i))=sumR/(2*scale+1)^2; 
    G(r(i),c(i))=sumG/(2*scale+1)^2; 
    B(r(i),c(i))=sumB/(2*scale+1)^2; 
end 

imPaint=cat(3,R,G,B); 
figure; 
imshow(imPaint); 

enter image description here

+0

편집 또는 답변이어야하는지 잘 모름 : 질문을 풀지 만 다른 질문을하십시오. 수행하지 않아야합니다. –

+0

또한 평균은 검은 색입니다. 평균을 시도하지만 흑인은 무시하십시오. –

+0

검정을 무시하는 방법? RGB <0.05 일 때 판사를 추가했습니다. RGB 값은 흰색을 얻습니다. 그러나 검은 선은 여전히 ​​존재합니다. 나는이 경우에 어떤 일이 일어날 지 모른다. – pring

관련 문제