投稿

ラベル(OpenCV)が付いた投稿を表示しています

Python OpenCVにおける輪郭(領域)

イメージ
輪郭: 初めの一歩 より import cv2 import numpy as np from matplotlib import pyplot as plt img = cv2.imread('pic.png') #cv2.imshow('img',img) #cv2.waitKey(0) imgray = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY) #cv2.imshow('imgray',imgray) #cv2.waitKey(0) ret,thresh = cv2.threshold(imgray,127,255,0) #cv2.imshow('thresh',thresh) #cv2.waitKey(0) image,contous = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) #cv2.imshow('image',contous) #cv2.waitKey(0) img = cv2.drawContours(img,image,-1,(0,255,0),3) cv2.imshow('img',img) cv2.waitKey(0) cv2.destroyAllWindows() 動いたが、正直良くわからない。 ここで画像を取り込んで、グレイに変換 im = cv2.imread('test.jpg') imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY) ここで2値化 ret,thresh = cv2.threshold(imgray,127,255,0) ここで輪郭抽出 image, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) cv2.findContours() 関数は3個の引数を必要とする関数です.第1引数は入力画像,第2引数はcontour retrieval mode,第3引数は輪郭検出方法を指定するフラグです...

python openCV 画像ピラミッド

イメージ
画像ピラミッド こちらを動かしてみた。 import cv2 import numpy as np import matplotlib.pyplot as plt higher_reso = cv2.imread('pic.png') lower_reso = cv2.pyrDown(higher_reso) lower_reso = cv2.pyrDown(lower_reso) lower_reso = cv2.pyrDown(lower_reso) higher_reso = cv2.cvtColor(higher_reso, cv2.COLOR_RGB2BGR) lower_reso = cv2.cvtColor(lower_reso, cv2.COLOR_RGB2BGR) plt.subplot(121),plt.imshow(higher_reso) plt.title('original Image') plt.subplot(122),plt.imshow(lower_reso) plt.title('lower_reso') plt.show()

Pyhton OpenCVのCannyエッジ検出

イメージ
OpenCVのCannyエッジ検出 を動かしてみた。 import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread('pic.png',0) edges=cv2.Canny(img,100,200) plt.subplot(121),plt.imshow(img,cmap='gray') plt.title('original Image'),plt.xticks([]),plt.yticks([]) plt.subplot(122),plt.imshow(edges,cmap='gray') plt.title('Edge Image'),plt.xticks([]),plt.yticks([]) plt.show()

Python openCV 画像の勾配

イメージ
画像の勾配 を動かしてみた。 import cv2 import numpy as np from matplotlib import pyplot as plt img = cv2.imread('pic.png',0) laplacian = cv2.Laplacian(img,cv2.CV_64F) #laplacian = cv2.Laplacian(img,cv2.CV_64F) sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=5) sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=5) plt.subplot(2,2,1),plt.imshow(img,cmap = 'gray') plt.title('Original'), plt.xticks([]), plt.yticks([]) plt.subplot(2,2,2),plt.imshow(laplacian,cmap = 'gray') plt.title('Laplacian'), plt.xticks([]), plt.yticks([]) plt.subplot(2,2,3),plt.imshow(sobelx,cmap = 'gray') plt.title('Sobel X'), plt.xticks([]), plt.yticks([]) plt.subplot(2,2,4),plt.imshow(sobely,cmap = 'gray') plt.title('Sobel Y'), plt.xticks([]), plt.yticks([]) plt.show() import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread('pic2.png') sobelx8u=cv2.Sobel(img,cv2.CV_8U,1,0,ksize=5) sobelx64f=cv2.Sobel(img,cv2.CV_64F,1,0,ksiz...

Python openCV モルフォロジー変換

モルフォロジー変換 こちらをやってみた 収縮(Erosion)と膨張(Dilation)、およびそれを組み合わせて輪郭を取り出したり、欠点を消したり強調することができる。 plt.subplot(331)の引数は(行、列、何番目)を表す。 matplotlib入門 こちらを参照した。 import cv2 import numpy as np from matplotlib import pyplot as plt img = cv2.imread('pic.png') kernel = np.ones((5,5),np.uint8) erosion = cv2.erode(img,kernel,iterations = 1) dilation = cv2.dilate(img,kernel,iterations = 1) opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel) closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel) gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel) tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel) tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel) blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel) print("# 矩形カーネル") print(cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))) print("# 楕円形カーネル") print(cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))) print("# 十字型カーネル") print(cv2.getStructuringElement(cv2.MORPH_CROSS,(5,5))) plt.subplot...

Python openCV ガウシアンフィルタ,中央値フィルタ

イメージ
ガウシアンフィルタ こちらを動かしてみた。 白色ノイズの除去に有効らしい。 import cv2 import numpy as np from matplotlib import pyplot as plt img = cv2.imread('opencv.png') blur = cv2.GaussianBlur(img,(5,5),0) plt.subplot(121),plt.imshow(img),plt.title('Original') plt.xticks([]),plt.yticks([]) plt.subplot(122),plt.imshow(blur),plt.title('Blurred') plt.xticks([]),plt.yticks([]) plt.show() 中央値フィルタ ごま塩ノイズに有効 import cv2 import numpy as np from matplotlib import pyplot as plt img = cv2.imread('goma.png') median = cv2.medianBlur(img,5) plt.subplot(121),plt.imshow(img),plt.title('Original') plt.xticks([]),plt.yticks([]) plt.subplot(122),plt.imshow(median),plt.title('median') plt.xticks([]),plt.yticks([]) plt.show()

Python openCV 画像のぼかし (平滑化)

イメージ
画像のぼかし (平滑化) を動かしてみた 5×5の範囲の平均化をcv2.blur()でとるので、ぼかして見える import cv2 import numpy as np from matplotlib import pyplot as plt img = cv2.imread('opencv.png') blur = cv2.blur(img,(5,5)) plt.subplot(121),plt.imshow(img),plt.title('Original') plt.xticks([]),plt.yticks([]) plt.subplot(122),plt.imshow(blur),plt.title('Blurred') plt.xticks([]),plt.yticks([]) plt.show()

Python openCV 画像の平滑化 とnp.ones()

画像の平滑化 こちらをやってみた。 NumPy,matplotも知らないことが多い 【Numpy入門 np.ones】配列の全要素を1で初期化するones関数の使い方 要素が1の配列を出力。タプルで多元配列も可。2番目の引数は変数型。デフォルトはfloat64型 import numpy as np x = np.ones(5) #array([1., 1., 1., 1., 1.]) x2 = np.ones((4,3)) #[[1. 1. 1.] #[1. 1. 1.] #[1. 1. 1.] #[1. 1. 1.]] NumPyのarange, linspaceの使い方(連番や等差数列を生成) np.arange(初期値、終了値、ステップ)ステップは実数も可 NumPyで連番や等差数列(等間隔の配列ndarray)を生成するにはnumpy.arange()かnumpy.linspace()を使う。 arange()は間隔(公差)を指定、linspace()は要素数を指定という違いがあるので、目的によって使い分ける。 import numpy as np print(np.arange(3)) # [0 1 2] print(np.arange(3, 10)) # [3 4 5 6 7 8 9] print(np.arange(3, 10, 2)) # [3 5 7 9] print(np.arange(0.3, 1.0, 0.2)) # [0.3 0.5 0.7 0.9] print(np.arange(-3, 3)) # [-3 -2 -1 0 1 2] print(np.arange(10, 3)) # [] print(np.arange(10, 3, -2)) # [10 8 6 4] numpy.linspace()も等差数列を生成するが、間隔(公差)ではなく要素数を指定する。 第一引数startに最初の値、第二引数stopに最後の値、第三引数numに要素数を指定する。それらに応じた間隔(公差)が自動的に算出される。 import numpy as np print(np.linspace(0, 10, 3)) # [ 0. 5. 10.] print(np.linspa...

Python openCV 大津の二値化

イメージ
大津の二値化 こちらを動かしてみた。 より鮮明に2値画像を判別できるらしい import cv2 import numpy as np from matplotlib import pyplot as plt img = cv2.imread('pic2.png',0) # global thresholding ret1,th1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY) # Otsu's thresholding ret2,th2 = cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU) # Otsu's thresholding after Gaussian filtering blur = cv2.GaussianBlur(img,(5,5),0) ret3,th3 = cv2.threshold(blur,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU) # plot all the images and their histograms images = [img, 0, th1, img, 0, th2, blur, 0, th3] titles = ['Original Noisy Image','Histogram','Global Thresholding (v=127)', 'Original Noisy Image','Histogram',"Otsu's Thresholding", 'Gaussian filtered Image','Histogram',"Otsu's Thresholding"] for i in range(3): plt.subplot(3,3,i*3+1),plt.imshow(images[i*3],'gray') plt.title(titl...

Python OpenCV 適応的しきい値処理

イメージ
適応的しきい値処理 をやってみた。 単純な2値化より、画像がはっきりする。人間の目は自動的にやってるんだろうな import cv2 import numpy as np from matplotlib import pyplot as plt img = cv2.imread('pic1.png',0) img = cv2.medianBlur(img,5) ret,th1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY) th2 =cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C,\ cv2.THRESH_BINARY,11,2) th3 =cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,\ cv2.THRESH_BINARY,11,2) titles = ['Original Image', 'Global Thresholding (v = 127)', 'Adaptive Mean Thresholding', 'Adaptive Gaussian Thresholding'] images = [img, th1, th2, th3] for i in range(4): plt.subplot(2,2,i+1),plt.imshow(images[i],'gray') plt.title(titles[i]) plt.xticks([]),plt.yticks([]) plt.show()

Python OpenCV 画像の閾値処理

イメージ
画像の閾値処理 を実行 【エラー】NameError: name ‘xrange’ is not defined とエラーが出たので こちら を参考にxrangeをrangeに修正 import cv2 import numpy as np from matplotlib import pyplot as plt img = cv2.imread('pic.png',0) ret,thresh1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY) ret,thresh2 = cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV) ret,thresh3 = cv2.threshold(img,127,255,cv2.THRESH_TRUNC) ret,thresh4 = cv2.threshold(img,127,255,cv2.THRESH_TOZERO) ret,thresh5 = cv2.threshold(img,127,255,cv2.THRESH_TOZERO_INV) titles = ['Original Image','BINARY','BINARY_INV','TRUNC','TOZERO','TOZERO_INV'] images = [img, thresh1, thresh2, thresh3, thresh4, thresh5] for i in range(6): plt.subplot(2,3,i+1),plt.imshow(images[i],'gray') plt.title(titles[i]) plt.xticks([]),plt.yticks([]) plt.show() 上手く動きました。 http://opencv.jp/opencv2-x-samples/image_binarize CV_THRESH_BINARY : 閾値を超えるピクセルは maxVal に,それ以外のピクセルは 0 になります. CV_THRESH_BINARY_INV : 閾値を超え...

Python openCV 射影変換

射影変換 を動かしてみた。 射影変換の導出式 によると 射影変換 任意の四角形を任意の四角形に変形することができる変換が射影変換です。 よって4組の対応点の座標が必要になります。 射影変換>アフィン変換>合同変換 import numpy as np import cv2 import matplotlib.pyplot as plt #Affine変換 img = cv2.imread("logo.png") rows,cols,ch = img.shape pts1 = np.float32([[56,65],[368,52],[28,387],[389,390]]) pts2 = np.float32([[0,0],[300,0],[0,300],[300,300]]) M = cv2.getPerspectiveTransform(pts1,pts2) dst = cv2.warpPerspective(img,M,(300,300)) plt.subplot(121),plt.imshow(img),plt.title('Input') plt.subplot(122),plt.imshow(dst),plt.title('Output') plt.show()

Python openCV アフィン変換

イメージ
アフィン変換とは 線形変換(拡大縮小、剪断、回転)と並行移動を組み合わせたもの。 数学的には行列の1次変換とベクトルの和ですね。変換前の辺の長さの比が変換後も変わらない。 指定には変換前、変換後の各3点の座標が必要 (1,0)→(a,c) (0,1)→(b,d)に変換して(tx,ty)分並行移動するので3点分の情報がいるのは納得 import numpy as np import cv2 import matplotlib.pyplot as plt #Affine変換 img = cv2.imread("logo.png") rows,cols,ch = img.shape pts1 = np.float32([[50,50],[200,50],[50,200]]) pts2 = np.float32([[10,100],[200,50],[100,250]]) M = cv2.getAffineTransform(pts1,pts2) dst = cv2.warpAffine(img,M,(cols,rows)) plt.subplot(121),plt.imshow(img),plt.title('Input') plt.subplot(122),plt.imshow(dst),plt.title('Output') plt.show()

Python openCV 画像の回転、移動、拡大

画像の幾何変換 こちらの例を動かしてみた。 import numpy as np import cv2 #拡大 img = cv2.imread("logo.png") res = cv2.resize(img,None,fx=3,fy=2,interpolation = cv2.INTER_CUBIC) cv2.imshow('image',res) cv2.waitKey(0) cv2.destroyAllWindows() #移動 #Warning cv2.warpAffine() 関数の第3引数には #出力画像のサイズを (width, height) という形式で指定しなければいけません. #widthは列の数,heightは行の数です # # Mはnp.float32の移動行列 # # +- -+ # | 1 0 x | # M = | | # | 0 1 y | # +- -+ # img = cv2.imread("logo.png") #print(img.shape) rows,cols,ch = img.shape M = np.float32([[1,0,100],[0,1,50]]) dst = cv2.warpAffine(img,M,(cols,rows)) cv2.imshow('image',dst) cv2.waitKey(0) cv2.destroyAllWindows() #回転 img = cv2.imread("logo.png") rows,cols,ch = img.shape M = cv2.getRotationMatrix2D((cols/2,rows/2),90,1) dst = cv2.warpAffine(img,M,(cols,rows)) cv2.imshow('image',dst) cv2.waitKey(0) cv2.destroyAllWindows()

Python + OpenCVで青い物体だけ検出

色空間の変換 WEBカメラの画像から青い物体だけ抽出できる。凄い。 import cv2 import numpy as np cap = cv2.VideoCapture(0) while(1): # Take each frame _, frame = cap.read() # Convert BGR to HSV hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) # define range of blue color in HSV lower_blue = np.array([110,50,50]) upper_blue = np.array([130,255,255]) # Threshold the HSV image to get only blue colors mask = cv2.inRange(hsv, lower_blue, upper_blue) # Bitwise-AND mask and original image res = cv2.bitwise_and(frame,frame, mask= mask) cv2.imshow('frame',frame) cv2.imshow('mask',mask) cv2.imshow('res',res) k = cv2.waitKey(5) & 0xFF if k == 27: break cv2.destroyAllWindows() 追跡する色(HSV)を調べる方法 >>> green = np.uint8([[[0,255,0 ]]]) >>> hsv_green = cv2.cvtColor(green,cv2.COLOR_BGR2HSV) >>> print hsv_green [[[ 60 255 255]]] 下界と上界をそれぞれ [H-10, 100,100]と[H+10, 255, 255] に設定 HSVの各成分はそれぞれ,Hueが色相,...

Python OpenCV で文字認識(OCR)

Python OpenCV で文字認識(OCR)をやってみた。 (最終回)Python + OpenCVで遊んでみる(OCR編) こちらのサイトを参考にした。 こちら から 「tesseract-ocr」をダウンロード。64bit版をDLした tesseract-ocr-w64-setup-v5.0.0-alpha.20200223.exe (64 bit) resp. OCRデータ をダウンロードする Data Files for Version 4.00 (November 29, 2016) jpn Japanese jpn.traineddata jpn.traineddataを以下のフォルダにコピーする。 C:\Program Files\Tesseract-OCR\tessdata インストール後、下記のパスを環境変数に登録します。 Pathに「C:\Program Files\Tesseract-OCR」を追加する。 環境変数項目としてTESSDATA_PREFIXを作成して、「C:\Program Files\Tesseract-OCR\tessdata」を追加する pyocrをインストールする pip install pyocr これで文字認識した。どのくらいの精度があるのかはまだ確認していない。 import pyocr import pyocr.builders import cv2 from PIL import Image import sys #利用可能なOCRツールを取得 tools = pyocr.get_available_tools() if len(tools) == 0: print("OCRツールが見つかりませんでした。") sys.exit(1) #利用可能なOCRツールはtesseractしか導入していないため、0番目のツールを利用 tool = tools[0] #画像から文字列を取得 res = tool.image_to_string(Image.open("doc.png"),lang="jpn",builder=pyocr.builders.WordBoxBuild...

Python OpenCVとWebカメラでバーコードリーダー

これがやってみたかった。 QRコードリーダーをOpenCVとTkinterで作る 一次元バーコードも認識するみたい。 pyzbarをインストール pip install pyzbar """ OpenCVの動画取得機能を利用し、TkのCanvasに描画して、QRコードを認識させるプログラム """ from datetime import datetime from time import sleep import tkinter import cv2 from PIL import Image, ImageTk from pyzbar import pyzbar root = tkinter.Tk() root.title("QR reader") root.geometry("640x480") CANVAS_X = 640 CANVAS_Y = 480 # Canvas作成 canvas = tkinter.Canvas(root, width=CANVAS_X, height=CANVAS_Y) canvas.pack() # VideoCaptureの引数にカメラ番号を入れる。 # デフォルトでは0、ノートPCの内臓Webカメラは0、別にUSBカメラを接続した場合は1を入れる。 cap = cv2.VideoCapture(0) def show_frame(): global CANVAS_X, CANVAS_Y ret, frame = cap.read() if ret == False: print('カメラから画像を取得できませんでした') image_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) # BGRなのでRGBに変換 image_pil = Image.fromarray(image_rgb) # RGBからPILフォーマットへ変換 image_tk = ImageTk.PhotoImage(image_pil) # ImageTkフォーマットへ変換 # image_t...

OpenCV PythonでQRコード作成、読込

QRコード作成 【QRコード】画像の生成 以下のモジュールをインストール pip install pillow pip install qrcode # -*- coding: utf-8 -*- import qrcode data = 'https://algorithm.joho.info' # 引数の文字列をQRコードに変換 img = qrcode.make(data) # QRコード画像の出力 img.save('output.png') QRコード読込 【Python/OpenCV4】QRコードの検出・読み取り # -*- coding: utf-8 -*- import cv2 # 入力画像のロード img = cv2.imread('qrcode.png') # データ、検出領域の四隅の座標、QRコードのバージョン情報を取得 qr = cv2.QRCodeDetector() data, points, straight_qrcode = qr.detectAndDecode(img) print('データ:', data) print("バージョン:", ((straight_qrcode.shape[0] - 21) / 4) + 1) """ データ: https://algorithm.joho.info バージョン: 2.0 """ 傾いても読めるのかな? QRコード検出APIの解説

AI・ディープラーニングを用いた検査自動化ソフトウェア「SDTest」をオープンソースでリリースへ!

AI・ディープラーニングを用いた検査自動化ソフトウェア「SDTest」をオープンソースでリリースへ! こういうのもあるのですね。

画像検査

がんばる人のための画像検査機 後で読みます。