Twoim zadaniem jest napisanie programu, który pobiera obraz wejściowy i uruchomić go przez wykrywanie krawędzi, aby stać się obrazem wyjściowym.
Wykrywanie krawędzi działa w następujący sposób (jeśli niejasne, patrz wykrywanie krawędzi sobel ):
- Wartość piksela to całkowita jasność piksela, więc jeśli jest kolorowy, najpierw musisz go przekonwertować na skalę szarości (aby zachować prostotę i możliwość gry w golfa, możesz przyjąć średnią wartość R, G i B).
- Wzory dla G x i G y dla piksela p (i, j) są następujące:
- G x = -1 * p (i-1, j-1) - 2 * p (i-1, j) - 1 * p (i-1, j + 1) + 1 * p (i + 1, j -1) + 2 * p (i + 1, j) + 1 * p (i + 1, j + 1)
- G y = -1 * p (i-1, j-1) - 2 * p (i, j-1) - 1 * p (i + 1, j-1) + 1 * p (i-1, j +1) + 2 * p (i, j + 1) + 1 * p (i + 1, j + 1)
- Wartość rozmiaru krawędzi tego piksela to: then (G x 2 + G y 2 )
Obraz wyjściowy jest dla każdego piksela wielkości krawędzi √ (G x 2 + G y 2 ) jako skala szarości.
Bonusy:
- Wykonaj rozmycie gaussowskie, aby wygładzić obraz przed uruchomieniem wykrywania krawędzi, aby pominąć mniejsze krawędzie. Daje to premię w wysokości -30% od wyniku końcowego.
- Weź pod uwagę kąt krawędzi. Nadajesz pikselowi wyjściowemu trochę koloru, przyjmując tę samą wartość w skali szarości i dodając kolor z koła kolorów przy użyciu kąta uzyskanego z formuły arctan (G y / G x ). Daje to kolejną premię w wysokości -30% od wyniku końcowego.
Zasady:
- Możesz pominąć wartość edgepixels i ustawić je na czarne, lub możesz użyć 0 dla dowolnego piksela poza obrazem.
- Obraz wyjściowy musi mieć format obrazu, który można otworzyć na większości komputerów.
- Dane wyjściowe muszą być zapisane na dysku lub nadawać się do potoku do pliku.
- Dane wejściowe są podawane jako argument wiersza polecenia, w postaci względnej ścieżki do obrazu lub przesyłane strumieniowo z wiersza polecenia.
- To jest kod golfowy, więc wygrywa najkrótszy kod w bajtach!
Odpowiedzi:
J,
166 164 161 154 150 144143 bajtów.Nie za dużo grałem w golfa; W większości zawróciłem swoją dłuższą implementację (patrz poniżej), więc prawdopodobnie jest wiele miejsca na ulepszenia. Korzysta z biblioteki BMP. Zapisuje wynik w pliku
o
. Obsługiwałem edgepixels tylko przy użyciu pełnych komórek 3x3, więc końcowy obraz ma szerokość i wysokość mniejszą o 2 piksele.Stosowanie:
Rozszerzony:
Przykładowe dane wejściowe i wyjściowe:
źródło
;._3
operatora podtablicy. Zauważyłem, że zdefiniowałeś czasownikp
z rangą 2 do działania na subarrays po ich utworzeniu. Zamiast tego możesz operować na każdej podtablicy podczas cięcia. Próbuję go wdrożyć w oparciu o twoją pracę256#.3#"0<.255<.3 3((|:S)&*+&.*:&(+/)&,S&*);._3%&3(3#256)+/@#:
. To powinno zmniejszyć do 126 bajtów ogółem.'o'writebmp~256#.3#"0<.255<.3 3(*+&.*:&(+/)&,(*|:))&((-,.0,.])1 2 1);._3%&3(3#256)+/@#:readbmp]stdin''
założeniu, że na standardowym wejściu jest wprowadzana tylko nazwa pliku. Możesz to zrobić za pomocą,echo -n
aby dodatkowa nowa linia nie była dołączona do standardowego wejścia. Na moim komputerze skrypt kończy się automatycznie, gdy używasz potokowego wejścia do skryptu, co oznacza, że nie muszę go dołączaćexit''
i mogę zapisać dodatkowe 6 bajtów, ale nie jestem pewien, czy to prawda dla wszystkich.Python, 161 * 0,7 = 112,7 bajtów
Z premią Gaussian Blur.
Ponieważ nie zabroniłeś jawnie wbudowanych metod, oto OpenCV:
Bez premii 136 bajtów
źródło
MATLAB, 212 * 0,4 = 84,8 bajtów
Korzystanie z przybornika filtra i przestrzeni kolorów HSV
lub bez golfa
źródło
Love2D Lua, 466 bajtów
Pobiera dane z wiersza poleceń, wyprowadza do pliku o nazwie „o” w folderze danych aplikacji Love2D. Love2D Nie pozwoli ci zapisywać plików gdziekolwiek indziej.
Prawie tak dobrze, jak mogłem, prawdopodobnie można by dalej grać w golfa.
Wyjaśnione
Test
I...
Chociaż tak naprawdę to nie poprawia mojego wyniku (co czyni go jeszcze gorszym), oto wersja z zaimplementowanym kołem kolorów.
900 - 270 = 630 bajtów
źródło