Jak uzyskać magiczny efekt koloru, taki jak skaner Cam za pomocą OpenCV

To jest oryginalny obraz.

Orignal Image

Cam Scanner magiczny efekt koloru.Efekt skanera Cam

Mój filtr na obrazku.

Mój filtr

Zmieniam kontrast obrazu.
dst.convertTo(dst, -1, 2, 0);

Następnie użyj rozmycia Gaussa do wygładzania.

cv::GaussianBlur(dst,result,cv::Size(0,0),3);
cv::addWeighted(dst, 1.5, result, -0.5, 0, result);

Co zrobić, aby osiągnąć taki efekt na moim wizerunku ?

UPDATE

Po Wyrównaniu Histogramu -

vector<Mat> channels;
Mat img_hist_equalized;
cvtColor(dst, img_hist_equalized, CV_BGR2YCrCb);
split(img_hist_equalized,channels);
equalizeHist(channels[0], channels[0]);
merge(channels,img_hist_equalized);
cvtColor(img_hist_equalized, img_hist_equalized, CV_YCrCb2BGR);

Histogram

Author: mjosh, 2015-10-02

5 answers

Aplikacja camscanner może używać jakiegoś skomplikowanego algorytmu do obsługi różnych przypadków piorunów, itp. Ale postaram się przybliżyć podstawowe podejście do tego problemu, podstawową ideą jest Binaryzacja danego obrazu wejściowego, a dokładniej możemy powiedzieć składanie danego obrazu, jeśli spojrzymy na dokumentację OpenCV, istnieje wiele odniesień do thresholding danego obrazu, więc zacznijmy od dokumentacji .

  • Global Threstholding: w tym podejściu Zakładamy, że wartość intensywności pierwszego planu jest zawsze poniżej pewnej wartości, w kontekście drukowanych arkuszy Zakładamy, że kolor atramentu jest zawsze czarny, a kolor papieru jest jednolity i intensywność jest większa niż intensywność koloru atramentu, więc bezpiecznie Zakładamy jakiś próg (powiedzmy 40), (max. is 255) i próg obrazu wejściowego jako :

     ret, thresh1 = cv2.threshold(img, 100, 255, cv2.THRESH_BINARY)
    

Tutaj wpisz opis obrazka

    ret, thresh1 = cv2.threshold(img, 130, 255, cv2.THRESH_BINARY)

Tutaj wpisz opis obrazka

There are many disadvantages to this method, First of all it is **NOT** independent of intensity variance, So there is a very less chance that you can accurately estimate  a threshold value which segments text from the given image, It has very limited applications, can be only applied in case where the background paper is exactly white with minimum variation in intensity, so this process cannot be used for **Real world** images.
  • Adaptive Threstholding: ta metoda obejmuje problem zmienności intensywności w danym obrazie, tutaj próg jest wykonywany na wartościach sąsiednich pikseli, więc przejścia z niższej intensywności na wyższą i odwrotnie są z powodzeniem przechwytywane tą metodą jako:

     thresh = cv2.adaptiveThreshold(original_img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)
    

Tutaj wpisz opis obrazka

*Further Work*: You may work on various techniques of denoising the binary image, to remove the dots, Or have a look at removing the salt and pepper noise from the image.
  • Otu ' s Binaryzacja: jest to kolejne ładne podejście, które inteligentnie oblicza wartość progową, między maksymami, może działać bardzo ładnie w niektórych przypadkach, ale wydaje się, że nie w Twoim przypadku.

     ret2,thresh = cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
    

Tutaj wpisz opis obrazka

Zasadniczo robi to samo próg globalny Ale teraz próg jest obliczany automatycznie tak, że próg leży między 2 pikami, a tym samym segmentuje atrament od papieru.

Zalecane "Metoda": {]} Myślę, że najlepszym podejściem jest adaptacyjny próg , możesz wypróbować inne techniki wstępnego przetwarzania, takie jak wyostrzanie obrazu, wyrównanie histogramu itd. i przeanalizuj, w jaki sposób tworzy bardziej realistyczne wyjście, możesz również spróbować wykonać pewne przetwarzanie końcowe, takie jak {72]}denoising obrazu, operacje morfologiczne

[7]}próbowałem denoising obrazu i okazało się, że bardziej skuteczne dla innych podejścia,
denoised = cv2.fastNlMeansDenoising(thresh, 11, 31, 9) # you may experiment with the constants here

Tutaj wpisz opis obrazka

Ale zapraszam do wypróbowania różnych kombinacji powyższych podejść, aby zobaczyć, które z nich działa we wszystkich przypadkach.

Uwaga: powyższa technika może działać dla mniej kolorowych obrazów. Jednak oto kolejna doskonała odpowiedź , która może rozwiązać przypadek kolorowych obrazów.

 13
Author: ZdaR,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-07-06 08:02:01

Bardzo prostą, ale skuteczną metodą radzenia sobie z tego typu obrazami jest korekta płaskiego pola.

Najpierw tworzysz "fałszywy" obraz o płaskim polu F, stosując bardzo silny filtr rozmycia do oryginalnego obrazuI. Następnie należy pomnożyć I przez średnią F i podzielić wynikowy obraz przez F (piksel po pikselu), aby uzyskać poprawiony obraz C. Mnożenie jest tylko po to, aby zachować ogólną jasność, podział jest tam, gdzie magia zdarza się.

W Zasadzie to: C = (I * mean(F)) / F

Wynikowy poprawiony obraz C usunie większość, jeśli nie wszystkie, niechcianego oświetlenia i koloru na dużą skalę. Następnie pozostaje tylko trochę rozciągania kontrastu i otrzymujesz wynik bardzo podobny do dostarczonego obrazu referencyjnego. (skala szarości, wysoki kontrast, ale bez progu)

Jeśli zastanawiasz się, jak wygląda wynik dla dostarczonego obrazu...

Po pierwsze, mieszkanie pole:

pole płaskie

Następnie poprawione zdjęcie:

poprawione zdjęcie

I wreszcie, po zwiększeniu kontrastu:

zwiększony kontrast

Najtrudniejsze w tym jest uzyskanie odpowiedniego płaskiego pola, ponieważ chcesz je rozmyć na tyle, aby pozbyć się tekstu, jednocześnie zachowując tło w jak największym stopniu. W tym przypadku pomocne mogą być filtry nieliniowe (np. mediana).

 5
Author: Felix G,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-07-04 07:58:02

Napisałem kod, który robi takie rzeczy, chociaż nie z OpenCV.

Zazwyczaj analizowałbym histogram, oszacowałbym, jakie "białe" i "czarne" są oparte na histogramie, a następnie skalowałbym wartości obrazu tak, aby Czarny był skalowany poniżej 0, a biały powyżej 1 (lub 255 w zależności od reprezentacji), ostatecznie zaciskając wartości kolorów.

Jednak z OpenCV może być prostszy sposób. Spróbuj użyć wyrównania histogramu na przyciętej stronie przed zastosowaniem filtr kontrastu-powinien rozkładać wartości pikseli w bardziej spójny sposób, aby regulacja kontrastu działała bardziej niezawodnie w większej liczbie sytuacji. Możesz spróbować użyć wyrównania histogramu zlokalizowanego, aby złagodzić gradienty na przyciętym obrazie z powodu oświetlenia, ale może to powodować problemy z pustymi obszarami strony.

 2
Author: Kaganar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-05 14:11:56

Użyłem Photoshopa, aby dowiedzieć się, techniki edycji wymagane do osiągnięcia efektu skanowania.

W programie Photoshop efekt skanowania można uzyskać za pomocą operacji "ustaw punkt bieli" i " ustaw punkt czerni "udostępnianych przez funkcję" poziomy". Połączenie tych dwóch operacji powoduje efekt skanowania często uważany za "magiczny kolor" w różnych aplikacjach mobilnych.

Oprócz tego, filtr górnoprzepustowy może być używany wraz z powyższymi dwoma operacjami, aby osiągnąć ekscytujące wyniki, takie jak cień usunięcie.

Skanowanie dokumentów w trybie "czarno-białym" odbywa się poprzez przetwarzanie obrazu w przestrzeni kolorów laboratoryjnych za pomocą OpenCV.

Powyższe operacje mogą być zaimplementowane w OpenCV przy użyciu różnych technik progowych i kilku podstawowych operacji matematycznych.

Możesz raz przejrzeć to repozytorium, aby uzyskać pełny wgląd w to, co próbuję powiedzieć.

Dodałem pełną dokumentację wiki dla projektu w powyższym repo.

To odpowiedź może nie wydawać się bardzo pouczająca, ale ponieważ repo daje rozbudowaną dyskusję, trzymam ten post krótko.

Przykładowe wyniki możemy osiągnąć za pomocą tych technik: Obraz w prawym górnym rogu i obraz pod nim są wejściami, podczas gdy inne obrazy są wyjściowe dla różnych trybów skanowania

Oznaczenia na tym obrazku pomagają nam zrozumieć typ wyjścia z każdego trybu omówionego w repo GitHub: Oznaczenia na tym obrazku pomagają nam zrozumieć typ wyjścia z każdego trybu omówionego w repo GitHub

 1
Author: MSD,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-02-10 18:38:25

Zdaję sobie sprawę, że jestem trochę spóźniony do gry, ale znalazłem to niesamowite, proste rozwiązanie:

src.convertTo(dst, -1, 1.9, -80);

Src i dst mogą być tym samym obrazem, jeśli pracujesz w potoku przetwarzania.

 0
Author: bstar55,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-15 20:32:06