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 № 1Istnieją 2 powody:
Precyzja: W ostatniej linii twojego
imageFilter
metoda, którą konwertujesz nauint8
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 danychdouble
, powoduje to splot podwójny, a więc większą dokładność.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 obrazconv2
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"));