あなたがしたいことは、しきい値処理と呼ばれます。
の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.より均一な照明を取得)ができない場合は、照明がすべての画像で同じ場合、より均一な照明を得るために、背景のみの空の画像を作成し、他の画像から減算します。
これはソフトウェアの問題ではないことを理解することが重要です。ボーダー領域では、背景が画像の中央付近の構造よりも実際に暗いです。これを確認するには、単一ピクセルのグレー値をチェックします。あなたの目だけがこれを補うのにとても良いです。以下に列挙する適応型閾値処理技術は、適切な局所閾値を見つけることを試みるが、これには限界がある。あなたはより適切なパラメータを見つけることができるかもしれませんが、私がお勧めしたいのは照明の均一性に取り組んでいることです。
私は下のスライダで、閾値を適応
- にあなたを可能にする画像で遊んためのコードの追加ビットを追加した
[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()
このソリューションを提供していただきありがとうございました。役立ちます。しかし、私はthreholdingイメージの詳細について1つの質問があります。スレッシュホールディングによって境界線の周りのイメージが改善されているにもかかわらず、内部領域がより明るくなります(ダークグレー色の領域)。画像#2の内部領域と画像#3(または#4)の境界領域を持つ画像を得ることは可能ですか? – Pupil
私はいくつかのあなたの制約と意図をよりよく理解する必要があります:1.)あなたは検査するより似たイメージを持っていますか?はいの場合は、それらのいくつかを提供できますか? (バリエーションの側面をカバーする)2.)正確さの点で最終的な目標は何ですか?vizualizeしたいですか?面積を測定したいですか?重心を探したいですか? – tfv
こんにちは...あなたのコメント:1)質問の更新セクションに2枚の写真を追加しました。 2)私の目標は、暗い灰色で占められているピクセル数(総面積の割合)を計算することです。 – Pupil