2012-12-15 8 views
7

Próbuję filtrować obraz w domenie przestrzeni, więc używam funkcji conv2.Niezdefiniowana funkcja "conv2" dla argumentów wejściowych typu "double" i atrybutów "full 3d real". - Matlab

Oto mój kod.

cd /home/samuelpedro/Desktop/APIProject/ 

close all 
clear all 
clc 

img = imread('coimbra_aerea.jpg'); 
%figure, imshow(img); 

size_img = size(img); 

gauss = fspecial('gaussian', [size_img(1) size_img(2)], 50); 

%figure, surf(gauss), shading interp 

img_double = im2double(img); 

filter_g = conv2(gauss,img_double); 

mam błąd:

Undefined function 'conv2' for input arguments of type 'double' and attributes 'full 3d 
real'. 

Error in test (line 18) 
filter_g = conv2(gauss,img_double); 

teraz zastanawiam, nie mogę używać wizerunku 3 kanałów, co oznacza, kolorowy obraz.

Odpowiedz

10

Obrazy kolorowe to trójwymiarowe tablice (x, y, kolor). conv2 jest zdefiniowany tylko dla 2 wymiarów, więc nie będzie działać bezpośrednio na trójwymiarowej tablicy.

trzy opcje:

  • stosowania jako n-wymiarowej splatania convn()

  • Konwersja do obrazu w skali szarości przy pomocy rgb2gray() i filtr 2D:

    filter_g = conv2(gauss,rgb2gray(img_double));

  • Filtruj każdy kolor (RGB) osobno w 2D:

    filter_g = zeros(size(im_double)); 
    for i = 1:3 
        filter_g(:,:,i) = conv2(gauss, im_double(:,:,i); 
    end 
    
+0

Filtrowanie każdego koloru osobno to świetny pomysł. nie pomyślałem o tym. :) – SamuelNLP

+0

Jeśli chcesz zrobić to szybciej, przekazując obraz wielopłaszczyznowy do imfilter lub od tego pytania robi filtrowanie gaussowskie, do imgaussfilt, będzie szybciej. Obie te funkcje umożliwiają obsługę danych wielopłaszczyznowych bez użycia pętli for. Zobacz moją odpowiedź poniżej, aby uzyskać więcej informacji. –

1

Dla wejścia n-D należy użyć convn.

+0

Cóż, bałem się, że to będzie jedyna szansa. ale convn zamienia matlab naprawdę wolno. – SamuelNLP

+0

@SamuelNLP: Możesz użyć 'convn', ale z dwoma 1-D filtrami gaussowskimi (jeden wzdłuż X, drugi wzdłuż Y). To znacznie przyspieszy twój kod. – Jonas

1

Jeśli masz R2015a lub nowszej, funkcja imgaussfilt IPT obsługuje multi-plane 2-d problemów splatania takiego, po prostu przekazać w swojej RGB obrazu.

http://www.mathworks.com/help/images/ref/imgaussfilt.html

Jeśli nie, imfilter wykonuje także wielopłaszczyznowego 2-D splot.

Obie będą szybsze dla filtru Gaussa, obaj wiedzą, jak zrobić oddzielną sztuczkę.

+0

Usuń również im2double podczas korzystania z imgaussfilt/imfilter, obie zastosuj optymalizacje SIMD dla wejść całkowitych, dzięki czemu będą one szybsze bez obsady. –

Powiązane problemy