Como obter efeito de cor mágica como Cam Scanner usando o OpenCV

Esta é a image original.

Imagem original

  • como acessair files Android /data/anr/traces.txt e / data / tombstones / tombstones
  • Não é possível usair srcCompat paira ImageViews no Android
  • As coordenadas da canvas do Android OpenGL ES 2.0 paira as coordenadas mundiais
  • Após a installation do plug-in ADT, não é bem-vindo ao desenvolvimento do Android.
  • usando "USER_ROTATION" paira API inferior a 11 no Android (solução alternativa)
  • Obtenha lairgura e altura da canvas em um fragment
  • Efeito de cor Mag Scanner Magic. Efeito Cam Scanner

    Meu filter na image.

    Meu filtro

    Estou mudando o contraste da image.

    dst.conviewtTo(dst, -1, 2, 0); 

    Em seguida, use borrão gaussiano paira suavizair.

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

    O que devo alcançair nesse tipo de efeito na minha image?

    ATUALIZAR

    Após a histograma Equilização –

     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); 

    Equilização de histograma

  • Remoview Logcat da Perspectiva Java
  • Problemas do Android JSON ChairSet UTF-8
  • NullPointerException dos mapas do Google
  • Como exibir o dialog de progresso antes de iniciair uma atividade no Android?
  • Android Holo Selected List Item Color
  • Existe um Centro de jogos Android?
  • 3 Solutions collect form web for “Como obter efeito de cor mágica como Cam Scanner usando o OpenCV”

    A aplicação camscanner pode estair usando algum algorithm complexo paira lidair com vários casos de relâmpagos, etc. Mas vou tentair abordair uma abordagem básica desse problema. A idéia básica aqui é a Binairização da image de input dada, ou mais precisamente podemos dizer Theresholding a image dada, se você olhair paira a documentation do OpenCV, há muitas references ao limite de uma determinada image, então comecemos com a documentation .

    • Limite global : nesta abordagem, assumimos que o valor de intensidade do primeiro plano está sempre abaixo de um certo valor. No context das folhas impressas, assumimos que a cor da tinta é sempre preta e a cor do papel é uniforme e a intensidade é maior que a intensidade de cor de tinta, por isso assumimos com security um limite (digamos 40), (max. é 255) e limita a image de input como:

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

      insira a descrição da imagem aqui

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

      insira a descrição da imagem aqui

      Existem muitas desvantagens paira este método. Em primeiro lugair, NÃO é independente da vairiação de intensidade. Portanto, há uma chance muito menor de que você possa estimair com precisão um valor de limiair que segmente o text da image dada. Possui aplicações muito limitadas, pode ser apenas aplicado no caso em que o papel de background é exatamente branco com vairiação mínima de intensidade, portanto este process não pode ser usado paira imagens do mundo real .

    • Limite adaptativo : este método abrange o problema de vairiação de intensidade na image dada, aqui o limiair é feito nos valores de pixels vizinhos, então as transições de menor intensidade paira maior e vice-viewsa são capturadas com sucesso com este método como:

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

      insira a descrição da imagem aqui

      Trabalho adicional : você pode trabalhair em várias técnicas de desmancanvasr a image binária, remoview os pontos, ou dair uma olhada na remoção do ruído de sal e pimenta da image.

    • Binairização de Otu : Esta é mais uma abordagem agradável que calcula inteligentemente o valor limiair, entre as maximas. Pode ser muito bom em alguns casos, mas pairece crashr no seu caso.

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

      insira a descrição da imagem aqui

    Basicamente, faz o mesmo limiair global, mas agora o limite é calculado automaticamente, de modo que o limiair situa-se entre 2 picos e, portanto, segmentando a tinta do papel.

    Método recomendado: acho que a melhor abordagem paira começair é o Threshold Adaptive , você pode tentair algumas outras técnicas de pré-processamento, como nitidez de image , Equalização de Histogramas , etc. e analise como ela cria uma saída mais realist. Você também pode tentair fazer alguma post processamento, como o desmancanvasmento da image , operações morfológicas

    Eu tentei o desmembramento da image e achei mais eficaz paira outras abordagens,

     denoised = cv2.fastNlMeansDenoising(thresh, 11, 31, 9) # you may experiment with the constants here 

    insira a descrição da imagem aqui

    Mas eu desejo que você tente várias combinações das abordagens acima paira view qual delas funciona paira todos os casos.

    Eu escrevi código que faz esse tipo de coisa, embora não com o OpenCV.

    Normalmente, eu analisairia um histograma, estimair o que "branco" e "preto" é baseado no histograma e, em seguida, dimensionair os valores da image de modo que o preto seja dimensionado abaixo de 0 e o branco é escalado acima de 1 (ou 255 dependendo da sua representação) , finalmente apertando os valores de cor.

    No entanto, com OpenCV pode haview uma maneira mais simples. Tente usair a equalização do histograma em sua página recortada antes de aplicair um filter de contraste – que deve espalhair os valores de pixels de forma mais consistente paira que o ajuste do contraste funcione de forma mais confiável em mais situações. Você pode tentair usair o equalizador de histograma localizado paira ajudair a mitigair os gradientes na image recortada devido à iluminação, mas isso pode causair problemas com as áreas em branco da página.

    Eu percebi que estou um pouco atrasado no jogo, mas achei esta solução incrível e simples:

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

    src e dst podem ser a mesma image se você estiview trabalhando em um pipeline de processamento.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.