Slide 1

Slide 1 text

画像処理ライブラリ OpenCVの使い方 大野 宏 Python機械学習勉強会in新潟 Restart#11

Slide 2

Slide 2 text

Pythonでよく使われる画像ライブラリ ・matplotlibグラフ作成ライブラリ 学習回数―認識率の グラフや画像の表示 ・Pillow 画像の回転や拡大縮小など基本的な処理

Slide 3

Slide 3 text

OpenCV ・無料の画像処理用ライブラリ 最新版は4.3.0 ・マルチプラットフォーム Windows、Linux、Mac、iOS、Android C、C++、Python、Java ・Intel社が開発して公開→Willow Garage社が開発・管理 ・matplotlib や Pillow より高機能 ・ディープラーニングの前処理や後処理に有効 ・OpenCVだけで傷の検査が出来る場合も

Slide 4

Slide 4 text

OpenCVの基本的な機能 ・画像の読み込みと表示 ・画像の拡大と縮小 ・画像の回転 ・図形の描画 ・フィルタ処理 ・ラベリング ・2値化

Slide 5

Slide 5 text

OpenCVのインストール方法 ・ターミナルを開いて pip install opencv-python ・確認 ターミナルでPythonを起動し $python [Enter] 下記の通りに入力して何も表示されなければOK >>import cv2 [Enter] >> ・Numpyもインストールしておくとよい

Slide 6

Slide 6 text

画像の読み込みと表示 #カラー img1=cv2.imread("lena.jpg",1) #白黒 img1=cv2.imread("lena.jpg",0) #表示 cv2.imshow ( "img1", img1 ) #表示時間 1秒 cv2.waitKey(1000) #保存 cv2.imwrite("img.png" , img1) USBカメラの画像も 簡単に表示できる

Slide 7

Slide 7 text

画像の拡大と縮小 img1=cv2.imread("building.jpg",1) height = img1.shape[0] width = img1.shape[1] #縮小 img2=cv2.resize(img1,(int(width*0.5), int(height*(0.5))) cv2.imshow( "img2", img2 ) cv2.waitKey(1000)

Slide 8

Slide 8 text

画像の反転、回転 img1=cv2.imread("building.jpg",1) img2=cv2.flip(img1,0) #上下反転 0 cv2.imshow ( "img2", img2 ) cv2.waitKey(1000) img2=cv2.flip(img1,1) #左右反転 >0 img2=cv2.flip(img1,-1) #左右反転 <0 img2=cv2.rotate(img1, cv2.ROTATE_90_CLOCKWISE) img2=cv2.rotate(img1, cv2.ROTATE_180) img2=cv2.rotate(img1,cv2.ROTATE_90_COUNTERCLOCKWISE)

Slide 9

Slide 9 text

画像の回転 img1=cv2.imread("building.jpg",1) height = img1.shape[0] width = img1.shape[1] center = (int(width/2), int(height/2)) angle = 45.0 scale = 1.0 trans = cv2.getRotationMatrix2D(center, angle , scale) img2 = cv2.warpAffine(img1, trans, (width,height)) cv2.imshow ( "img2", img2 ) cv2.waitKey(1000)

Slide 10

Slide 10 text

四角形、線、円の描画 img1=cv2.imread("building.jpg",1) cv2.rectangle(img1, (200, 200), (500, 500), (255, 0, 0), thickness=2, lineType=cv2.LINE_4) cv2.line(img1, (100, 100), (600, 100), (0, 255, 0), thickness=2, lineType=cv2.LINE_4) cv2.circle(img1, (440,400), 100, (0,0,255), thickness=2, lineType=cv2.LINE_4, shift=0) cv2.imshow ( "img", img1 ) cv2.waitKey(1000)

Slide 11

Slide 11 text

フィルタ処理(平均値) img1=cv2.imread("lena.jpg") #平均値フィルタ img2=cv2.blur(img1,(3,3)) cv2.imshow ( "img2", img2 ) cv2.waitKey(1000) 1/9 1/9 1/9 1/9 1/9 1/9 1/9 1/9 1/9

Slide 12

Slide 12 text

フィルタ処理(Sobel) img1=cv2.imread("building.jpg",0) img3=cv2.Sobel(img1,cv2.CV_32F,1,0) img3=cv2.convertScaleAbs(img3) cv2.imshow ( "img1", img1 ) cv2.imshow ( "img3", img3 ) cv2.waitKey(1000) 横方向に強調→縦線検出 -1 0 1 -2 0 2 -1 0 1

Slide 13

Slide 13 text

フィルタ処理(Sobel) img1=cv2.imread("building.jpg",0) img2=cv2.Sobel(img1,cv2.CV_32F,0,1) img2=cv2.convertScaleAbs(img2) cv2.imshow ( "img1", img1 ) cv2.imshow ( "img2", img2 ) cv2.waitKey(1000) img3=img2|img3 cv2.imshow ( "img3", img3 ) cv2.waitKey(1000) 縦方向に強調→横線検出 -1 -2 -1 0 0 0 1 2 1

Slide 14

Slide 14 text

フィルタ処理(Sobel)の結果

Slide 15

Slide 15 text

フィルタ処理(Canny) 輪郭線を綺麗に抽出するフィルター img1=cv2.imread("building.jpg",0) img2=cv2.Canny(img1,100,200) cv2.imshow ( "img1", img1 ) cv2.imshow ( "img2", img2 ) cv2.waitKey(1000)

Slide 16

Slide 16 text

2値化とラベリング1 2値化:グレイスケールの画像を適当な値で0と1に分ける ラベリング:1の塊ごとに番号をつける 元画像 ラベルごとに色付け

Slide 17

Slide 17 text

2値化とラベリング2 img1=cv2.imread("pic1.png”,1) img2=cv2.cvtColor(img1,cv2.COLOR_BGR2GRAY) #2値化 ret,img3=cv2.threshold(img2,100,255,cv2.THRESH_BINARY) #ラベリング n,label=cv2.connectedComponents(img3) height = img3.shape[0] width = img3.shape[1] str1='height:'+str(height)+' width:'+str(width) print(str1) cv2.imshow ( "img3", img3 )

Slide 18

Slide 18 text

ラベルの色付け colors=[] colors.append([0,0,0]) colors.append([255,0,0]) colors.append([0,255,0]) colors.append([0,0,255]) colors.append([0,255,255]) for y in range(0,height): for x in range(0,width): if 0

Slide 19

Slide 19 text

前処理での利用例 煎餅の良・不良の判別をYOLOで行う場合、学習データとし てアノテーションが必要 → OpenCVを使うと作業が楽 良品 不良品(欠けや割れ)

Slide 20

Slide 20 text

2値化とラベリングで領域検出 ・2値化とラベリングして煎餅の領域を検出する

Slide 21

Slide 21 text

良・不良のラベル付け ・面積で良・不良を判別してラベルを付ける 良品 不良品 良品

Slide 22

Slide 22 text

目視で修正 ・誤った半別を目視で修正し、データ作成完了 良品 不良品

Slide 23

Slide 23 text

画像処理による傷の検査 ・2値化、ラベリング、大きい塊を傷と認識 → 引っ掻き傷は2値化すると線が途切れる ・傷の画像を集め、画像処理(大きさ、濃淡、傾き)で数を 増し、ディープラーニングで判別 現画像 2値画像 直線なら傷 途切れるとノイズ?

Slide 24

Slide 24 text

参考図書 ・Python、C++ ・各アルゴリズムがどのよう な計算をしているかも記述 ・ネットで検索すると参考にな るもの多数あり