2015-10-02 17 views
12

これは元の画像です。OpenCVを使用してCam Scannerのようなマジックカラー効果を得る方法

Orignal Image

カムスキャナマジックの色の効果。 Cam Scanner effect

イメージのフィルタ。

My filter

私は、画像のコントラストを変更しています。

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

次に、スムージングにガウスブラーを使用します。

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

私の画像にこのような影響を与えるにはどうすればよいですか?ヒストグラムEquilization後

UPDATE

-

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 Equilization

+0

BWまたはグレースケールのパレットですか? –

+0

適応的な閾値と思われます – Miki

+0

私はこのようなことをトレールとエラーで行い、しきい値を手動で設定します。この場合、ターゲットはBWまたはグレースケールである必要があります。私は 'floodtest'のための機会を見ることができます - ' floodfill'と同様の考え方 - 隣人からの "白"ピクセルの最大面積を分析するでしょう。 –

答えて

6

camscannerアプリケーションでは、さまざまな雷ケースなどを処理するための複雑なアルゴリズムが使用されている可能性がありますが、そのような問題に対する基本的なアプローチを取り上げます。入力画像の二値化以上具体的には、Theresoldingというイメージがあります。OpenCVのドキュメントを見ると、与えられたイメージをしきい値処理するための参照がたくさんあるので、documentationから始めましょう。

  • グローバルしきい:このアプローチでは、我々は、前景の輝度値が印刷されたシートの文脈では、常に一定値以下であると仮定し、我々は、インクの色は常に黒であり、紙色があると仮定します均一であり、強度はインクの色の強度よりも大きいので、我々は安全に何らかの閾値(例えば40)を仮定する。この方法には多くの欠点があります

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

    enter image description here

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

    enter image description here

    、それは強度分散の独立しではありませんまず第一に:として255)と、閾値入力画像ありしたがって、与えられた画像からテキストをセグメント化するしきい値を正確に見積もることができる可能性は非常に低く、アプリケーションが非常に限られており、適用のみ可能です背景紙が明度の変化が少なく、正確に白である場合には、このプロセスは現実世界の画像には使用できません。この方法は、所与の画像における強度変動の問題を覆う下部高いに強度及びその逆の遷移は正常にこの方法で捕捉されるように、ここでの閾値は、隣接する画素の値に行われる:適応閾値

  • 以下のように:

    ​​

    enter image description here

    さらなる作業:あなたは、ドットを削除するには、バイナリ画像をノイズ除去の様々な技術に取り組むこと、またはhイメージから塩とコショウのノイズを取り除くのを見てください。

  • OTUの二値化:これは極大値の間で、それはいくつかの例では非常に素晴らしい働きがあり、まだインテリジェント閾値を算出別の素敵なアプローチですが、あなたのケースで失敗しているようです。

    enter image description here

それは基本的に同じグローバルしきい値を行うしかし、今の閾値は閾値が2つのピーク、ひいては紙からインクをセグメントの間に位置するように自動的に計算され

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

。メソッド推奨

を私は開始するための最良のアプローチは適応閾値だと思い、あなたはあなたは、などsharpening imageHistogram Equalisation、などいくつかの他の前処理技術を試してみて、それがより現実的な出力を作成する方法を分析してもよいですまた、denoising the imageようないくつかの後処理を行うためにMorphological operations

を試みることが、私は、画像のノイズ除去を試してみましたが、他のアプローチにそれがより有効であることが見出さ

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

enter image description here

しかし、私はあなたが1のすべてのケースのために働くかを確認するには、上記のアプローチの様々な組み合わせを試して歓迎。

+0

これは良い解決策ですが、私は二値化を使用していません。二値化は二値画像を生成する。しかし、この例では、処理された画像はクリーンで強調されているが、2つ以上の色を有する。したがって、私は適応型二値化がそのトリックを行うことはできないと考えています。 – feelfree

+0

私はまだそれを試していないけれども、それは色のついた画像のためにもうまくいくでしょう。 – mjosh

+0

いいえ、それは私が十分な時間を取得した場合、私は色の画像のためにこれを動作させることを試みるだろう、魔法の色が実際に何かにかかわらず、特定の入力の期待された出力を取得しようと色の画像では動作しません。 – ZdaR

1

私はではないがOpenCVので、この種のものを行うコードを書いています。

通常、私はヒストグラムを分析し、ヒストグラムに基づいて "白"と "黒"を推定し、黒が0以下にスケーリングされ、白が1以上にスケーリングされるようにイメージ値をスケーリングします最終的に色の値を固定します。

しかし、OpenCVではより簡単な方法があります。コントラストフィルタを適用する前に、クロップされたページでヒストグラムイコライゼーションを使用してください。これにより、より一貫性のある方法でピクセル値が広がり、より多くの状況でコントラストをより確実に動作させることができます。 ローカライズされたヒストグラム均等化を使用して、照明によるクロップされた画像のグラデーションを緩和することができますが、ページの空白部分に問題が発生する可能性があります。

+0

動作しません更新された回答を参照してください – mjosh

1

私はゲーム後半に少しだ実現が、私はこの素晴らしい、簡単な解決策を見つけた:あなたは処理パイプラインで作業している場合

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

srcとdstが同じイメージすることができます。

+0

コントラストのみが変更されます。私が投稿したソースイメージイメージで試してみてください。 – mjosh

+0

srcとdstは何ですか?彼らは同じビットマップですか? – Narendra

+0

技術的に言えば、画像データを含むMatオブジェクトです。 srcとdstが同じ場合、変換は効果的に「インプレース」で行われます。 srcとdstが異なるMatオブジェクトである場合、dst Matは変換されたsrcデータを含みます。 – bstar55

関連する問題