2017-11-28 11 views
1

私は背景とのコントラストが非常に低い画像を持っています。 2つの矢印の間の最初の線は、コントラストの低い線です。 2行目はOKです。下の画像をご覧ください。イメージの輝度コントラストを改善する方法は?

enter image description here

以下に示すように原画像です。

enter image description here

Iは、グレースケールのコントラストを高めるために以下の方法を使用します。 まず、画像をグレー色に変更し、次の方法を使用します。

cv::Mat temp; 
for (int i = 0; i < 1; i++) // number of iterations has to be adjusted 
{ 
    cv::threshold(image, temp, 0, 255, CV_THRESH_BINARY| CV_THRESH_OTSU);// 
    cv::bitwise_and(image, temp, image); 
    cv::normalize(image, image, 0, 255, cv::NORM_MINMAX, -1, temp);  
} 

グレースケールで少しコントラストの高い画像がありますが、グレースケールやカラーでこれより優れた方法はありますか?

enter image description here

+0

私はラインバーを分離しようとしたが、失敗しました。 https://i.stack.imgur.com/vCen2.png – Silencer

+0

@Silencerどの方法を使用しましたか?あなたの結果は面白いです。 – batuman

答えて

2

私はあなたのニーズに応えるかもしれない、histogram equalizationになります。基本(グローバル)イコライゼーション、さらにはadaptiveでも素晴らしい結果が得られます。パラメータは適応型メソッドのためにチューニングする必要があります(今のところdocsサンプルのものを使用してください)。

は私が(グローバルイコライゼーション - 左を、適応等化を - 右)を取得:

enter image description here

均等化が完了すると(あなたの例では、非常に低コントラストであるが)、あなたがしきい値とのより良い運を持っているかもしれません。

enter image description here

そこから、あなたはあなたの第一黒い線の場所を見つけようとするなどの標準的な輪郭/形状マッチングを使用することができます。 @ Doleronの回答に基づいて、私はfastNlMeansDenoisingを使用することをお勧めしますこの特定の問題のために(任意のヒストグラム均等化の前に適用):

import cv2 
import matplotlib.pyplot as plt 
import numpy as np 

raw_img_load = cv2.imread('H1o8X.png') 

imgr = cv2.cvtColor(raw_img_load,cv2.COLOR_BGR2GRAY) 
clahe = cv2.createCLAHE(clipLimit=30.0, tileGridSize=(8,8)) 
imgray_ad = clahe.apply(imgr)#adaptive 
imgray = cv2.equalizeHist(imgr)#global 
res = np.hstack((imgray,imgray_ad))#so we can plot together 

plt.imshow(res,cmap='gray') 
plt.show() 

ret,thresh = cv2.threshold(imgray_ad,150,255,type=cv2.THRESH_BINARY+cv2.THRESH_OTSU) 
plt.imshow(thresh,cmap='gray') 
plt.show() 

EDITから頂いた

。ただし、高解像度画像/時間に敏感な画像処理では遅い機能になる場合があります。

+0

ありがとういいアイデア。 – batuman

1

@Antoine Zambelliの回答はawsomeであり、正しいものです。とにかく、私はここにいくつかを掘って、最終的な結果を改善するために、fastNlMeansDenoisingで以前にノイズを除去しようとした:

enter image description here

#include <opencv2/imgproc/imgproc.hpp> 
#include <opencv2/highgui/highgui.hpp> 
#include "opencv2/photo.hpp" 

using namespace cv; 
using cv::CLAHE; 

int main(int argc, char** argv) { 
    Mat srcImage = imread("H1o8X.png", CV_LOAD_IMAGE_GRAYSCALE); 
    imshow("src", srcImage); 

    Mat denoised; 

    fastNlMeansDenoising(srcImage, denoised, 10); 

    Mat image = denoised; 

    Ptr<CLAHE> clahe = createCLAHE(); 
    clahe->setClipLimit(30.0); 
    clahe->setTilesGridSize(Size(8, 8)); 
    Mat imgray_ad; 
    clahe->apply(image, imgray_ad); 
    Mat imgray; 
    cv::equalizeHist(image, imgray); 
    imshow("imgray_ad", imgray_ad); 
    imshow("imgray", imgray); 

    Mat thresh; 
    threshold(imgray_ad, thresh, 150, 255, THRESH_BINARY | THRESH_OTSU); 
    imshow("thresh", thresh); 

    Mat result; 
    Mat kernel = Mat::ones(8, 8, CV_8UC1); 

    erode(thresh, result, kernel); 
    imshow("result", result); 

    waitKey(); 
    return 0; 
} 
+0

+1最終結果をクリーンアップするために侵食!私は 'fastNlMeansDenoising'を完全に打ち切り、それを一掃しました。 –

関連する問題