Miałem procedurę binaryzacji C++, której używałem do późniejszej operacji OCR. Jednak stwierdziłem, że spowodowało niepotrzebne pochylenie tekstu. Poszukując alternatyw znalazłem GPUImage o wielkiej wartości i rozwiązałem problem pochylania.iOS Unieważnienie binarizacji dla OCR - obsługa obrazów o różnej luminancji
Używam GPUImage code like this do binaryzacji obrazów wejściowych przed zastosowaniem OCR.
Jednak wartość progowa nie obejmuje zakresu obrazów, które otrzymuję. Zobacz dwie próbki z moich obrazów wejściowych:
nie mogę poradzić zarówno z samej wartości progowej. Niska wartość wydaje się być dobra z późniejszym, a wyższa wartość jest w porządku z pierwszą.
Drugi obraz wydaje się być szczególnie złożony, ponieważ nigdy nie uzyskałem prawidłowej binaryzacji wszystkich znaków, niezależnie od ustawionej wartości progowej. Z drugiej strony moja rutyna binaryzacji C++ wydaje się robić to dobrze, ale nie mam zbyt wiele wglądu, by eksperymentować z nią jak uproszczona wartość progowa w GPUImage.
Jak mam sobie z tym poradzić?
UPDATE:
Próbowałem z GPUImageAverageLuminanceThresholdFilter
z domyślnym mnożnik = 1. Współpracuje z pierwszego obrazu ale drugi obraz nadal jest problemem.
Niektóre bardziej różnorodne wejścia dla binaryzacji:
UPDATE II:
Po przejściu przez this answer by Brad próbował GPUImageAdaptiveThresholdFilter
(również włączenie GPUImagePicture ponieważ Wcześniej używał go tylko na UIImag mi).
Dzięki temu otrzymałem doskonały obraz binarny. Jednak pierwszy wydaje się mieć dużo hałasu po binaryzacji, gdy ustawię rozmiar rozmycia na 3.0. OCR powoduje dodanie dodatkowych znaków. Przy mniejszej wartości rozmycia drugi obraz traci precyzję.
Oto ona:
+(UIImage *)binarize : (UIImage *) sourceImage
{
UIImage * grayScaledImg = [self toGrayscale:sourceImage];
GPUImagePicture *imageSource = [[GPUImagePicture alloc] initWithImage:grayScaledImg];
GPUImageAdaptiveThresholdFilter *stillImageFilter = [[GPUImageAdaptiveThresholdFilter alloc] init];
stillImageFilter.blurSize = 3.0;
[imageSource addTarget:stillImageFilter];
[imageSource processImage];
UIImage *imageWithAppliedThreshold = [stillImageFilter imageFromCurrentlyProcessedOutput];
// UIImage *destImage = [thresholdFilter imageByFilteringImage:grayScaledImg];
return imageWithAppliedThreshold;
}
Co robi twój C++ binaryzacji rutynowe wyglądać? Być może można to zaadaptować do niestandardowego filtra w ramach. Czy jest to lokalna binaryza adaptacyjna, czy też globalna progresja? –
Co robi procedura C++ to skalowanie skali szarości + binaryzacja. Jeśli chodzi o GPUImage, samodzielnie wykonuję skalowanie w skali szarości, a następnie przekazuję dane wyjściowe do filtra GPUImage. Używam jednej z wielu technik skalowania szarości wspomnianych na stackoverflow. Czy chcesz, żebym o tym wspomniał? Zasadniczo używam do tego 3 różnych programów, ale wyniki nie różnią się zbytnio, więc uważam, że nie ma to znaczenia. –
To nie jest moja rutyna C++, jak już powiedziałem, dostarczona przez kogoś innego i nie mogę jej tutaj całkowicie udostępnić, ani nie mogę podsumować, jak to działa, ponieważ nie mam zbyt wiele wglądu w to, jak to działa. To dość skomplikowane. To, co opisałem, jest tym, co czerpię z zawartych w nim komentarzy. –