/ / Konwolucja po zastosowaniu jądra filtra gaussowskiego - matlab, przetwarzanie obrazu, wizja komputerowa, maska, splot

Konwolucja po zastosowaniu jądra filtra gaussowskiego - matlab, przetwarzanie obrazu, wizja komputerowa, maska, splot

Napisałem fragment kodu tutaj aby zwinąć obraz z danym jądrem. Dzięki sugestii, którą otrzymałem na dole strony, udało mi się uzyskać [prawie] dokładnie ten sam obraz w porównaniu z tym, kiedy używam funkcji conv2. Przez prawie mam na myśli, że obrazy wyglądają tak samo, gdy są wyświetlane przez imshow, ale wartości na zdjęciach wyjściowych różnią sięmało ale. Jednak pogarsza się, gdy z obrazem utworzę gaussowskie jądro. Wówczas wyjścia mojej własnej i funkcji conv2 bardzo się różnią! Dlaczego? Czy możesz mi powiedzieć, co jest ze mną nie tak?

Okazuje się, że popełniłem błąd. Dokonałem pewnych modyfikacji w imageFilter (), nie zauważając, że istnieją od dwóch dni do teraz!

Możesz zobaczyć kod imageFilter () tutaj.

gaussKernel = fspecial("gaussian", 3, 2);
testImage1 = imageFilter(image, gaussKernel);
testImage2 = conv2(image, gaussKernel);

Dziękuję Ci

Odpowiedzi:

1 dla odpowiedzi № 1

Istnieją 2 powody:

  1. Precyzja: W ostatniej linii twojego imageFilter metoda, którą konwertujesz na uint8 typ danych (który jest 8-bitową liczbą całkowitą), a więc zasadniczo zaokrąglasz swój wynik:

    finalImg = uint8(finalImg);

    Metoda rodzima conv2 jednak jest przedstawiony z matrycą gaussKernel typu danych double, powoduje to splot podwójny, a więc większą dokładność.

  2. Warunki brzegowe: conv2 ma trzeci parametr (patrz docs), co ma związek z kształtem wyniku. W twojej metodzie obliczasz wynik splotu z zerowym wypełnieniem podobnie rozmiar jako oryginalny obraz conv2 domyślnie oblicza pełny splot.

Prosta modyfikacja da identyczne wyniki:

gaussKernel = fspecial("gaussian", 3, 2);
testImage1 = imageFilter(im, gaussKernel);
testImage2 = uint8(conv2(im, gaussKernel, "same"));