パイソン+ OpenCVのマシンビジョンベースの技法(エッジ検出、画像フィルタリング、エッジ検出オペレータ、投影、文字切り出し板)

  マシンビジョンは、人工知能の急成長を遂げている枝です。簡単に言えば、マシンビジョンではなく、人間の目のマシンを使用することで測定し、裁判官を行います。なお、画像処理、機械工学、照明光源を制御し、光学系、センサー、アナログおよびデジタルビデオ技術を撮影、コンピュータソフトウェアおよびハードウェアを含む集積技術(画像強調と分析アルゴリズム、グラフィックスカード、I / Oカードでありますなど)。

  いくつかの基本的なマシンビジョンですここでは、技術が使用されてのpython + OpenCVのです。パイソンは、Linux、Windowsの、アンドロイドおよびMac OSオペレーティングシステム上で実行できるクロスプラットフォームのコンピュータビジョンライブラリを発行した非常に便利な高レベルのプログラミング言語、少ないコードで、OpenCVのは、BSDライセンスに基づいています。これは、軽量で効率的である-画像処理およびコンピュータビジョン実現などインターフェースのPython、Rubyの、MATLAB言語、多くの一般的なアルゴリズムを提供しながら、C関数とC ++クラスの少量の系列から成ります。

:エッジ検出

  マシンビジョンでは、それは非常に基本的な画像処理操作であるが、非常に重要な知見は、画像処理におけるエッジ抽出です。エッジ検出、輪郭画像を処理するためのデジタル画像処理手段。より強い境界、グレー値に対して、エッジとして定義されます。すなわち、変曲点がムラの発生における変化の関数を指し、旋回点です。およびその誘導体の高い数はリンクされ、指定されたオブジェクトのエッジを抽出します。しかし、PythonのOpenCVので簡単+エッジ抽出操作を行うことができます。

  次のステップ:

画像逆色を閾値1

  私たちは最初のPythonのファイルを作成する必要があり、輸入CV2ライブラリ(OpenCV2 Pythonライブラリ)、およびディスプレイ映像コード:

import cv2

# 读取本相对路径下的initial.bmp文件
image = cv2.imread ("initial.bmp")  
# 将image对应图像在图像窗口显示出来
cv2.imshow('initial',image)
# waitKey使窗口保持静态直到用户按下一个键
cv2.waitKey(0)

  画像分割の閾値は、閾値を2値化シンボルグレースケール画像を得るために、80に設定されています。

# 对图像进行阈值分割,阈值设定为80,得到二值化灰度图
ret,image1 = cv2.threshold(image,80,255,cv2.THRESH_BINARY)
cv2.imshow('grayscale',image1)

  抗カラー画像は、次の通り:

image2 = image1.copy()		# 复制图片
for i in range(0,image1.shape[0]):	#image.shape表示图像的尺寸和通道信息(高,宽,通道)
for j in range(0,image1.shape[1]):
	image2[i,j]= 255 - image1[i,j]
cv2.imshow('colorReverse',image2)

2.エッジ検出

  以下は、エッジ抽出、エッジ検出法または原画像腐食、エッジ抽出を減算することによって縮小画像とキャニー映画findContours差法です。コードは以下の通りであります:

# 边缘提取
img = cv2.cvtColor(image2,cv2.COLOR_BGR2GRAY)
canny_img_one = cv2.Canny(img,300,150)
canny_img_two = canny_img_one.copy()	# 复制图片
for i in range(0,canny_img_one.shape[0]):	#image.shape表示图像的尺寸和通道信息(高,宽,通道)
	for j in range(0,canny_img_one.shape[1]):
		canny_img_two[i,j]= 255 - canny_img_one[i,j]
cv2.imshow('edge',canny_img_two)

  次のように最終的に我々は、グラフィックエッジ抽出の後に取得することができます。

II:画像フィルタリング

  画像フィルタリング、画像のディテールの特徴を維持する条件下で、すなわち、雑音抑圧対象画像が、必須画像前処理操作であり、治療効果が良いか悪いかは、直接後続の画像処理及び分析の有効性に影響を与える、と信頼性。

  ノイズこのような記録装置としての撮像システム、及び伝送媒体の欠陥に起因する入力画像は、画像処理汚染のいくつかの領域において予想されるオブジェクトでない場合、デジタル画像は、伝送または記録プロセスにより、形成されます。

  多くの画像フィルタリング及びフィルタリングの方法があり、この実験で使用される方法をフィルタリングすることは、平均フィルタリング、ガウシアンフィルタリングおよびメディアンフィルタ、エッジ検出及びガウス分布です。

  平均フィルタは、フィルタテンプレートを構成する8つの画素の中心と注目画素の周囲の周囲の隣接画素を(含むテンプレートを画像に注目画素を指し、典型的な線形フィルタリングアルゴリズムである、すなわち、除去します注目画素自体)は、テンプレートのすべてのピクセルの平均値は、元の画素値を置換します。

  メディアンフィルタは、非線形信号処理技術に基づいて統計理論を注文し、基本的な原理は、デジタル画像におけるメジアンフィルタ値または各ポイントのポイント値の近傍でデジタルビット列を効果的に抑制ノイズであることができます従って近く遮音を除去する点付近の画素値の真値に対する中央値の代わりに。

  ガウスノイズを除去するガウス平滑化フィルタ線形、ノイズ低減処理が広く、画像処理で使用されています。ガウシアンフィルタリングは加重平均した後に得られた独自の近傍画素値により各画素の重み付け平均値の全体画像処理上で行われ、他のれます。

  エッジ検出の目的は、重要なデジタル画像の輝度変化点を識別することです。エッジ検出は、ガウスエッジ検出ガウス方法です。

  次のステップ:

1.読み取った原稿

  次のように第一印象元のコードは次のようになります。

import cv2
import cv2 as cv

# 读取本相对路径下的initial.bmp文件
image = cv2.imread ("initial.png")
# 加入文本信息
cv2.putText(image,'initial',(50,50),cv2.FONT_HERSHEY_SIMPLEX,1.5,(255,0, 0),4)
# 将image对应图像在图像窗口显示出来
cv2.imshow('initial',image)
cv2.waitKey(0)

2.平均値フィルタ

  そして、平均値フィルタは、次の通り:

# 均值滤波
image2 = cv2.blur(image,(10,5))
cv2.putText(image2,'averageFiltering',(50,50),cv2.FONT_HERSHEY_SIMPLEX,1.5,(255,0, 0),4)
cv2.imshow('averageFiltering',image2)

3.メディアンフィルタ

  その後、メディアンフィルタは、次の通り:

image3 = cv2.medianBlur(image, 5)
cv2.putText(image3,'medianFiltering',(50,50),cv2.FONT_HERSHEY_SIMPLEX,1.5,(255,0, 0),4)
cv2.imshow('medianFiltering',image3)

4.ガウスフィルタ

  ガウス・フィルタリングの後、次のように:

# 高斯滤波
image4 = cv2.GaussianBlur(image,(5,5),0)
cv2.putText(image4,'gaussianFilter',(50,50),cv2.FONT_HERSHEY_SIMPLEX,1.5,(255,0, 0),4)
cv2.imshow('gaussianFilter',image4)

ガウスエッジ検出

  最終的なガウスエッジ検出は、次の通り:

# 高斯边缘检测
gau_matrix = np.asarray([[-2/28,-5/28,-2/28],[-5/28,28/28,-5/28],[-2/28,-5/28,-2/28]])
img = np.zeros(image.shape)
hight,width = image.shape
for i in range(1,hight-1):
	for j in range(1,width-1):
		img[i-1,j-1] = np.sum(image[i-1:i+2,j-1:j+2]*gau_matrix)
image5 = img.astype(np.uint8)
cv2.putText(image5,'gaussianEdgeDetection',(50,50),cv2.FONT_HERSHEY_SIMPLEX,1.5,(255,0, 0),4)
cv2.imshow('gaussianEdgeDetection',image5)

III:エッジ検出オペレータ

  エッジ検出は、画像処理およびコンピュータビジョンにおける基本的な問題であり、エッジ検出画像識別番号の目的は、見かけの輝度変化点となります。深さの不連続を含む、不連続面の方向は、材料特性が変化し、シーン照明の変化。これは、コンピュータビジョン分野の特徴抽出です。

  原理上、あなたはより高次の導関数を使用することができるが、実際の画像セグメンテーションでは、多くの場合、唯一の一次及び二次導関数を用いているが、理由は、ノイズの影響により、純粋に二次微分動作にノイズが存在するであろう敏感な現象は、上記情報の第三の誘導体は、多くの場合、失われた値です。グラデーションタイプの二次導関数はまた、変異を説明することができます。境界を見つけられないかもしれない唯一の一次導関数を使用して、このようなグレースケール画像における均一変化としていくつかの場合、に、第2の誘導体は、有用な情報を提供することができます。二次導関数は、ノイズに敏感であり、溶液は、画像を平滑化し、いくつかのノイズ、及び、エッジ検出を排除しています。しかし、二次微分アルゴリズムの使用は、の情報に基づくゼロ交差を検出し、エッジ点は、従って、以下、後続の処理および識別作業に資する得ます。

  コンピュータビジョンは、人間の視覚のプロセスの模倣です。したがって、オブジェクトのエッジ、その最初の輪郭点の粗検出の検出において、元は、リンクルールによって接続された輪郭点を検出するだけでなく、偽の境界点を検出し、欠落している境界点を接続して除去します。エッジ画像は、画像の重要な特徴は、それがコンピュータビジョンとパターン認識の基礎であり、画像処理は、エッジ検出、したがって重要な部分です。

  OpenCVのにもいくつかのエッジ検出方法を有し、順序は、ロバーツクロス演算子、プレウィット演算子、ソベル演算子、キャニーオペレータ、オペレータKrisch、コンパスオペレータを有し、二次存在マー-Hildreth、ゼロ交差の傾斜方向に二次微分。

  次のステップ:

1.ディスプレイのアートワーク

  まず、元の画像を表示するには、次のコードを使用します。

# 读取本相对路径下的dip_switch_02.bmp文件
src_s = cv2.imread ("dip_switch_02.bmp",0)
cv2.imshow('src_s',src_s)

2.抗カラー画像

  画像抗色、抗色原色オーバーレイが白色になることがあり、あなたが(RGB:255,255,255)の白色を使用することができマイナス原画像の色ので、黒と白の画像のために、我々は最初の8ビットのグレーをロードこの操作後に再び書き込まれ、画像、0〜255の階調値に対応する各画素、各画素Aの階調値を読み取るだけ必要、255の、画像の色を反転します。コードは以下の通りであります:

src = cv.imread("dip_switch_02.bmp")
height, width, channels = src.shape
for row in range(height):
    for list in range(width):
        for c in range(channels):
            pv = src[row, list, c]
            src[row, list, c] = 255 - pv
cv.imshow("AfterDeal", src)

3.画像エッジ検出ソーベル法

  ソーベル演算子は微分ガウス平滑化誘導体を合成エッジ検出のための離散微分演算子です。画像シェーディング近似度を算出するためのオペレータ。領域の画像エッジの隣に濃淡の度合いに応じて、より具体的なポイントの特定の数よりもエッジを示さ。現在の画素の影響の隣接点からの距離が現在のピクセルの大きな影響周辺の対応する画素とは異なることに概念上の重量増加に基づいてソーベルオペレータプレウィットオペレータ、それによって画像を実現シャープ及びエッジプロファイルを強調表示します。

  ソーベルエッジ演算子より正確な位置決めサブ、一般に大騒音に使用される、画像のグレー階調
Sobelオペレータを得るために、それぞれ、平面ように、2つの3x3の行列、それぞれ水平および垂直テンプレート、画像の畳み込みを含みます水平方向および垂直方向の輝度差分近似。

  コードは以下の通りであります:

# 用sobel方法进行边缘检测
x = cv2.Sobel(src,cv2.CV_16S,1,0)
y = cv2.Sobel(src,cv2.CV_16S,0,1)
absX = cv2.convertScaleAbs(x)   # 转回uint8
# cv2.imshow("absX", absX)

# 截图后反转
def inverse_color(image):
	height, width, channels = image.shape
	for row in range(height):
			for list in range(width):
				for c in range(channels):
					pv = image[row, list, c]
					image[row, list, c] = 255 - pv

	cv.imshow("result", image)
one = cv.imread("2.jpg")
inverse_color(one)

4.画像のエッジ検出方法ロバート

  また、微分クロス勾配アルゴリズムに基づいているクロス微分オペレータとして知らロバーツオペレータは、局所的な差によって検出されたエッジ線を算出します。これは、アルゴリズムがより良い治療効果である、場合45度または-45度にポジティブ画像エッジ近く、急峻な低ノイズの画像を処理するために使用されます。欠点は、抽出されたエッジ太い線のエッジの少ない正確​​な位置決めです。

# 用robert方法进行边缘检测
dst = cv2.addWeighted(absX,0.5,absY,0.5,0)
# cv2.imshow("dst", dst)
# 截图后反转
def inverse_color(image):
	height, width, channels = image.shape
	for row in range(height):
			for list in range(width):
				for c in range(channels):
					pv = image[row, list, c]
					image[row, list, c] = 255 - pv
cv.imshow("result", image)
three = cv.imread ("3.jpg")
inverse_color(three)

4:突起

  投影は、カメラ画像平面に投影されている場面です。透視投影、アフィン投影、弱透視投影系等の透視投影を入力します。

  OpenCVのでは、突起は、水平投影と垂直投影に分割されています。二次元の水平投影画像をy軸上に投影され、垂直投影画像は、二次元X軸で投影。

  投影の水平および垂直方向に、第1の階調に画像を投影し、その後、水平方向および垂直方向に投影した後、分離閾値を二値化します。データ分析とmatplotlibのライブラリとCV2データベースの操作。
  次のステップ:

1.ディスプレイのアートワーク

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

img=cv2.imread('123.jpg')

2.投影の垂直方向

img=cv2.imread('123.jpg') #读取图片,装换为可运算的数组
GrayImage=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #将BGR图转为灰度图
ret,thresh1=cv2.threshold(GrayImage,130,255,cv2.THRESH_BINARY)#将图片进行二值化(130,255)之间的点均变为255(背景)
(h,w)=thresh1.shape #返回高和宽
a = [0 for z in range(0, w)] 
#记录每一列的波峰
for j in range(0,w): #遍历一列 
	for i in range(0,h): #遍历一行
		if thresh1[i,j]==0: #如果改点为黑点
			a[j]+=1 #该列的计数器加一计数
			thresh1[i,j]=255 #记录完后将其变为白色 

for j in range(0,w): #遍历每一列
	for i in range((h-a[j]),h): #从该列应该变黑的最顶部的点开始向最底部涂黑
		thresh1[i,j]=0 #涂黑
plt.imshow(thresh1,cmap=plt.gray())
plt.show()
cv2.imshow('one',thresh1) 
cv2.waitKey(0)

3.水平投影

for j in range(0,h): 
	for i in range(0,w): 
		if thresh1[j,i]==0: 
			a[j]+=1 
			thresh1[j,i]=255

for j in range(0,h): 
	for i in range(0,a[j]): 
		thresh1[j,i]=0 

plt.imshow(thresh1,cmap=plt.gray())
plt.show()

5:ナンバープレートの文字セグメンテーション

  ナンバープレート認識システム(車両ナンバープレート認識、VLPR)は、車両のナンバープレート認識のコンピュータビデオ画像認識技術におけるアプリケーションです。

  ナンバープレート認識技術は、ナンバープレートの動きが車両グレード、色やその他の情報を識別するために、複雑な背景から抽出され、プレートの抽出、画像前処理、特徴抽出、ライセンスプレートの文字認識技術によって識別することができ、最新の技術を必要とします99.7%の認識率のための文字と数字は文字認識率は99%に達することができ、達成することができます。

  ナンバープレートの文字セグメンテーション、動作させるための文字認識へ。これは、識別するために行われ、ブロックが直接囲まれています。ステップは、ナンバープレートのグレースケール画像にカラー画像をさせるために必要とされ、その後抗色、閾値セグメンテーション、再利用所望の長さ及び幅の連続小さなブロックを取っ水平および垂直投影が、識別されます。使用される技術は、Python + OpenCVのCV2ライブラリやデータ解析numpyのライブラリです。
  次のステップ:

1.読み取った原稿

import cv2
import cv2 as cv
import numpy as np

image1 = cv.imread('123456.jpg',1)
cv.imshow('image1', image1)

2.階調変換

  次いで、これを画像読取がグレースケール画像を読み取るために設けられているグレースケール画像に変換されます。

image2 = cv.imread('123456.jpg',0)
cv.imshow('image2', image2)

3.アンチ色

  次に、抗カラー画像、255階調減算色の記録幅と高さと深さ、および幅と高さ。

height, width, deep = image1.shape
dst = np.zeros((height,width,1), np.uint8)
for i in range(0, height):
    for j in range(0, width):
        grayPixel = image2[i, j]
        dst[i, j] = 255-grayPixel
cv2.imshow('image3', dst)

4.値化

  次いで、抗カラー画像の閾値を分割した後、閾値が100に設定されています。

ret, thresh = cv2.threshold(dst, 100, 255, cv2.THRESH_TOZERO)
cv2.imshow('image4', thresh)

5.プロジェクション

  投影の水平および垂直方向のアレイユニットの最初の長さの後に、投影は、図1に示した、黒点とレコード投影座標値に使用した後に返された各分割された小矩形に二つの機能、特徴点を設定されています。

# 水平方向投影
def hProject(binary):
    h, w = binary.shape
    # 水平投影
    hprojection = np.zeros(binary.shape, dtype=np.uint8)
    # 创建h长度都为0的数组
    h_h = [0]*h
    for j in range(h):
        for i in range(w):
            if binary[j,i] == 0:
                h_h[j] += 1
    # 画出投影图
    for j in range(h):
        for i in range(h_h[j]):
            hprojection[j,i] = 255
    return h_h

# 垂直反向投影
def vProject(binary):
    h, w = binary.shape
    # 垂直投影
    vprojection = np.zeros(binary.shape, dtype=np.uint8)
    # 创建 w 长度都为0的数组
    w_w = [0]*w
    for i in range(w):
        for j in range(h):
            if binary[j, i ] == 0:
                w_w[i] += 1
    for i in range(w):
        for j in range(w_w[i]):
            vprojection[j,i] = 255
    return w_w

6.セグメンテーション文字認識の一致

  返される配列は、分割位置、文字認識マッチングセグメンテーションを決定します。

th = thresh
h,w = th.shape
h_h = hProject(th)
start = 0
h_start, h_end = [], []
position = []
# 根据水平投影获取垂直分割
for i in range(len(h_h)):
    if h_h[i] > 0 and start == 0:
        h_start.append(i)
        start = 1
    if h_h[i] ==0 and start == 1:
        h_end.append(i)
        start = 0
for i in range(len(h_start)):
    cropImg = th[h_start[i]:h_end[i], 0:w]
    if i ==0:
        pass
    w_w = vProject(cropImg)
    wstart , wend, w_start, w_end = 0, 0, 0, 0
    for j in range(len(w_w)):
        if w_w[j] > 0 and wstart == 0:
            w_start = j
            wstart = 1
            wend = 0
        if w_w[j] ==0 and wstart == 1:
            w_end = j
            wstart = 0
            wend = 1
        # 当确认了起点和终点之后保存坐标   
        if wend == 1:
            position.append([w_start, h_start[i], w_end, h_end[i]])
            wend = 0
# 确定分割位置
for p in position:
    cv2.rectangle(thresh, (p[0], p[1]), (p[2], p[3]), (0, 0, 255), 2)
cv2.imshow('image7', thresh)
cv.waitKey(0)

おすすめ

転載: www.cnblogs.com/ITXiaoAng/p/12593782.html