2016-10-21 2 views
2

на основе Shai и коды Biguri «s и комментарии, я закончил цветное изображение, как это:Как сделать гладким и удалить белый край? Кроме того, почему черные ответы возникают в моем ответе? Как его решить?

enter image description here

возникает проблема, как убрать белый край и сделать ее гладкой? Одним из решений может быть сборка матрицы 3x3 или более крупная и средняя. Но вычисления должны быть большими для каждой точки белого края. Или могут быть некоторые полезные функции в Matlab, чтобы справиться с этими проблемами? enter image description here

+0

Почему вы размещения изображения в 'jpg' формате? Формат 'jpg' - это формат [lossy compression] (https://en.wikipedia.org/wiki/Lossy_compression), который создает артефакты. Пожалуйста, замените изображение на формат 'png'. – Rotem

+1

Ты отлично справляешься с этим! Аккуратно, правда! Я рад, что вы нашли время, чтобы прочитать и изменить наши ответы! –

+0

Благодарим вас за руководство. Это интересно сделать это возможным. – pring

ответ

3

Если у вас есть лицензия для инструментария для обработки изображений, вы можете попробовать использовать, например, medfilt2, чтобы применить к нему медианный фильтр. Фильтр с 11 по 11 срединным должен делать трюк. Не совсем сложно переопределить фильтр самостоятельно, если у вас нет инструментария.

Это только одна из возможностей, вы можете использовать множество различных фильтров, которые будут иметь разные удары по удалению края резкости.

Edit: Вот быстрое внедрение медианный фильтр (он может содержать ошибки и могут быть оптимизированы):

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, как показано на Rotem ниже:

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

ОК, он работает, но вам нужно применять фильтр по R, G и B отдельно: 'RGB = cat (3, medfilt2 (RGB (:,:, 1), [11,11]), medfilt2 (RGB (: ,:, 2), [11,11]), medfilt2 (RGB (:,:, 3), [11,11])); ' – Rotem

1

Это мое решение. Я беру n * n патч, чтобы усреднить ближний RGB. Но возникает проблема. Почему правая сторона обработанного изображения показывает черные линии?

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

 Смежные вопросы

  • Нет связанных вопросов^_^