2016-04-06 10 views
1

明るい灰色の背景色(色合いのバリエーションを含む)を単一の色、たとえば明るい灰色に変換するにはどうすればよいですか?私は背景色の上に埋め込まれた暗い灰色の色を1つの単一の色にしたい。今まで私が行ってきたことは、この2つの領域に2つの最も近い色の名前( 'lightgray'と 'dimgray')を割り当て、各ピクセルのr、g、bの差の二乗和を最小にして、webcolorsモジュール。イメージ内の色の異なる色合いを1つの色に変換する

rd = (r_c - requested_color[0]) ** 2 
gd = (g_c - requested_color[1]) ** 2 
bd = (b_c - requested_color[2]) ** 2 

オリジナル画像:私のPythonコードから生成

enter image description here

画像:あなたはそれが境界に沿って、私はないですことがわかります

enter image description here

gまでできるあなたが元の画像で見ることができるように明るい灰色の色。

答えて

3

あなたがしたいことは、しきい値処理と呼ばれます。

のOpenCVとPythonでこれを行う方法の一般的な導入は、ここで見つけることができます:あなたは結果で見ることができるように

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

img = cv2.imread('image.png',0) 
img = cv2.medianBlur(img,7) 
ret,th1 = cv2.threshold(img,160,255,cv2.THRESH_BINARY) 
th2 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,31,5) 
th3 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,31,5) 
titles = ['Original Image', 'Global Thresholding (v = 127)', 
'Adaptive Mean Thresholding', 'Adaptive Gaussian Thresholding'] 
images = [img, th1, th2, th3] 
for i in xrange(4): 
    plt.subplot(2,2,i+1),plt.imshow(images[i],'gray') 
    plt.title(titles[i]) 
    plt.xticks([]),plt.yticks([]) 
plt.show() 

http://docs.opencv.org/3.1.0/d7/d4d/tutorial_py_thresholding.html#gsc.tab=0

が、私はそこにコードのいくつかのパラメータを適応していますあなたのイメージの問題は、背景の強度の強い変化です。あなたのイメージの起源を知らなくても、私は、ソフトウェアによってこれを解決しようとする前に、次の2つのオプションのいずれかで開始したい:

1)

2.より均一な照明を取得)ができない場合は、照明がすべての画像で同じ場合、より均一な照明を得るために、背景のみの空の画像を作成し、他の画像から減算します。

これはソフトウェアの問題ではないことを理解することが重要です。ボーダー領域では、背景が画像の中央付近の構造よりも実際に暗いです。これを確認するには、単一ピクセルのグレー値をチェックします。あなたの目だけがこれを補うのにとても良いです。以下に列挙する適応型閾値処理技術は、適切な局所閾値を見つけることを試みるが、これには限界がある。あなたはより適切なパラメータを見つけることができるかもしれませんが、私がお勧めしたいのは照明の均一性に取り組んでいることです。

enter image description here

私は下のスライダで、閾値を適応

  • にあなたを可能にする画像で遊んためのコードの追加ビットを追加した

    [EDIT]

  • マウスの右ボタンを使用して元の画像をもう一度表示し、異なるマウス位置の グレー値を確認し、右のをクリックします210マウスボタンをもう一度押すと、しきい値表示に戻り、最後のマウス位置のグレー値 を新しいしきい値として使用します。

import cv2 
import numpy as np 

mode = "" 
Schwelle =0 

def nothing(x): 
    pass 

def read_pixel(event,x,y,flags,param): 
    global mode, Schwelle 
    if event == cv2.EVENT_MOUSEMOVE: 
     if mode == "Analyse": 
      ix,iy = x,y 
      font = cv2.FONT_HERSHEY_SIMPLEX 
      img2=img.copy() 
      cv2.putText(img2,str(ix)+" "+str(iy)+": "+str(img[y,x]),(50,50), font, 1,(255,255,255),2,cv2.LINE_AA)  
      cv2.imshow('image',img2) 
    elif event == cv2.EVENT_RBUTTONDOWN: 
     if mode == "Analyse": 
      mode="" 
      Schwelle=img[y,x] 
      cv2.createTrackbar('Schwelle','image',Schwelle,255,nothing)    
     else: 
      mode = "Analyse" 
    elif event == cv2.EVENT_LBUTTONDOWN: 
     Schwelle= img[y,x] 

img =cv2.imread('image.png',0) 
cv2.namedWindow('image') 
cv2.setMouseCallback('image',read_pixel) 
cv2.createTrackbar('Schwelle','image',128,255,nothing) 

while(1): 
    k = cv2.waitKey(1) & 0xFF 
    if k == 27: 
     break 

    if mode != "Analyse": 
     Schwelle = cv2.getTrackbarPos('Schwelle','image') 
     ret,thresh1 = cv2.threshold(img,Schwelle,255,cv2.THRESH_BINARY) 
     cv2.imshow('image',thresh1) 

cv2.destroyAllWindows() 
+0

このソリューションを提供していただきありがとうございました。役立ちます。しかし、私はthreholdingイメージの詳細について1つの質問があります。スレッシュホールディングによって境界線の周りのイメージが改善されているにもかかわらず、内部領域がより明るくなります(ダークグレー色の領域)。画像#2の内部領域と画像#3(または#4)の境界領域を持つ画像を得ることは可能ですか? – Pupil

+0

私はいくつかのあなたの制約と意図をよりよく理解する必要があります:1.)あなたは検査するより似たイメージを持っていますか?はいの場合は、それらのいくつかを提供できますか? (バリエーションの側面をカバーする)2.)正確さの点で最終的な目標は何ですか?vizualizeしたいですか?面積を測定したいですか?重心を探したいですか? – tfv

+0

こんにちは...あなたのコメント:1)質問の更新セクションに2枚の写真を追加しました。 2)私の目標は、暗い灰色で占められているピクセル数(総面積の割合)を計算することです。 – Pupil

関連する問題