大学で使用した自作の資料等を,手直しの上公開している. クリエイティブ・コモンズ BY NC SA.
ねらい:OpenCV を用いて,コンピュータビジョンの基本を体験し演習する.
【目次】
【サイト内の OpenCV 関連ページ】
【OpenCV の公式情報】
【サイト内の関連ページ】
【関連する外部ページ】
Python の公式ページ: https://www.python.org/
Python で OpenCV を動かすためのもの.
OpenCV Python のインストールは:別ページ »で説明1~2 コマンドの実行でインストールできる.
https://github.com/opencv/opencv/tree/master/samples/data で公開されている fruits.jpg, home.jpg を使用する(謝辞:画像の作者に感謝します)
次のコマンドを実行.
cd %LOCALAPPDATA% curl -L https://github.com/opencv/opencv/blob/master/samples/data/fruits.jpg?raw=true -o fruits.jpg curl -O https://raw.githubusercontent.com/opencv/opencv/master/samples/data/home.jpg
次のコマンドを実行.
sudo mkdir -p /usr/local/image cd /usr/local/image sudo chown -R $USER . curl -L https://github.com/opencv/opencv/blob/master/samples/data/fruits.jpg?raw=true -o fruits.jpg curl -O https://raw.githubusercontent.com/opencv/opencv/master/samples/data/home.jpg
次のコマンドを実行.
curl -L https://github.com/opencv/opencv/blob/master/samples/data/fruits.jpg?raw=true -o fruits.jpg curl -O https://raw.githubusercontent.com/opencv/opencv/master/samples/data/home.jpg
画像やイメージヒストグラムをプロットする.
jupyter qtconsole
import os import numpy as np import cv2 %matplotlib inline import matplotlib.pyplot as plt import warnings warnings.filterwarnings('ignore') # Suppress Matplotlib warnings IMROOT=os.environ['LOCALAPPDATA'] + '/' bgr = cv2.imread(IMROOT + "fruits.jpg") mono = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY) plt.style.use('default') plt.imshow(cv2.cvtColor(bgr, cv2.COLOR_BGR2RGB)) plt.show() plt.imshow(mono, cmap='gray') plt.show()
import os import numpy as np import cv2 %matplotlib inline import matplotlib.pyplot as plt import warnings warnings.filterwarnings('ignore') # Suppress Matplotlib warnings IMROOT=os.environ['LOCALAPPDATA'] + '/' bgr = cv2.imread(IMROOT + "home.jpg") mono = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY) plt.style.use('default') plt.imshow(cv2.cvtColor(bgr, cv2.COLOR_BGR2RGB)) plt.show() plt.imshow(mono, cmap='gray') plt.show()
ここでのイメージヒストグラムは,画素の明るさによるヒストグラム.横軸が明るさ(右に行くほど明るい).縦軸が画素数.
画像やイメージヒストグラムをプロットする. ここでは Jupyter Qt Console を使用して,プロットを行う
jupyter qtconsole
import os import numpy as np import cv2 %matplotlib inline import matplotlib.pyplot as plt import warnings warnings.filterwarnings('ignore') # Suppress Matplotlib warnings IMROOT=os.environ['LOCALAPPDATA'] + '/' bgr = cv2.imread(IMROOT + "fruits.jpg") mono = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY) plt.style.use('default') plt.imshow(mono, cmap='gray') plt.show() plt.hist(mono.ravel(), 256, [0, 256]) plt.show()
ヒストグラムが表示されるので確認.
import os import numpy as np import cv2 %matplotlib inline import matplotlib.pyplot as plt import warnings warnings.filterwarnings('ignore') # Suppress Matplotlib warnings IMROOT=os.environ['LOCALAPPDATA'] + '/' bgr = cv2.imread(IMROOT + "home.jpg") mono = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY) plt.style.use('default') plt.imshow(mono, cmap='gray') plt.show() plt.hist(mono.ravel(), 256, [0, 256]) plt.show()
ヒストグラムが表示されるので確認.
ヒストグラム平坦化は、モノクロ画像の表示をあざやかにするなどで役に立つ方法. イメージヒストグラムが平坦化するように,画素の輝度を調整する.
画像などをプロットする. ここでは Jupyter Qt Console を使用して,プロットを行う
jupyter qtconsole
import os import numpy as np import cv2 %matplotlib inline import matplotlib.pyplot as plt import warnings warnings.filterwarnings('ignore') # Suppress Matplotlib warnings IMROOT=os.environ['LOCALAPPDATA'] + '/' bgr = cv2.imread(IMROOT + "fruits.jpg") mono = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY) equ = cv2.equalizeHist(mono) plt.style.use('default') plt.imshow(mono, cmap='gray') plt.show() plt.imshow(equ, cmap='gray') plt.show()
画像が表示されるので確認.
今度は、ヒストグラムを表示する
import os import numpy as np import cv2 %matplotlib inline import matplotlib.pyplot as plt import warnings warnings.filterwarnings('ignore') # Suppress Matplotlib warnings IMROOT=os.environ['LOCALAPPDATA'] + '/' bgr = cv2.imread(IMROOT + "fruits.jpg") mono = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY) equ = cv2.equalizeHist(mono) plt.style.use('default') plt.imshow(equ, cmap='gray') plt.show() plt.hist(mono.ravel(), 256, [0, 256]) plt.show() plt.hist(equ.ravel(), 256, [0, 256]) plt.show()
ヒストグラムが表示されるので確認.
import os import numpy as np import cv2 %matplotlib inline import matplotlib.pyplot as plt import warnings warnings.filterwarnings('ignore') # Suppress Matplotlib warnings IMROOT=os.environ['LOCALAPPDATA'] + '/' bgr = cv2.imread(IMROOT + "home.jpg") mono = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY) equ = cv2.equalizeHist(mono) plt.style.use('default') plt.imshow(mono, cmap='gray') plt.show() plt.imshow(equ, cmap='gray') plt.show()
画像が表示されるので確認.
今度は、ヒストグラムを表示する
import os import numpy as np import cv2 %matplotlib inline import matplotlib.pyplot as plt import warnings warnings.filterwarnings('ignore') # Suppress Matplotlib warnings IMROOT=os.environ['LOCALAPPDATA'] + '/' bgr = cv2.imread(IMROOT + "home.jpg") mono = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY) equ = cv2.equalizeHist(mono) plt.style.use('default') plt.imshow(mono, cmap='gray') plt.show() plt.imshow(equ, cmap='gray') plt.show() plt.hist(mono.ravel(), 256, [0, 256]) plt.show() plt.hist(equ.ravel(), 256, [0, 256]) plt.show()
ヒストグラムが表示されるので確認.
CLAHE は,輪郭線が、残りやすくなるようなヒストグラム平坦化とされる.
画像などをプロットする. ここでは Jupyter Qt Console を使用して,プロットを行う
jupyter qtconsole
import os import numpy as np import cv2 %matplotlib inline import matplotlib.pyplot as plt import warnings warnings.filterwarnings('ignore') # Suppress Matplotlib warnings IMROOT=os.environ['LOCALAPPDATA'] + '/' bgr = cv2.imread(IMROOT + "fruits.jpg") mono = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY) clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8)) equ = clahe.apply(mono) plt.style.use('default') plt.imshow(mono, cmap='gray') plt.show() plt.imshow(equ, cmap='gray') plt.show()
画像が表示されるので確認.
今度は、ヒストグラムを表示する
import os import numpy as np import cv2 %matplotlib inline import matplotlib.pyplot as plt import warnings warnings.filterwarnings('ignore') # Suppress Matplotlib warnings IMROOT=os.environ['LOCALAPPDATA'] + '/' bgr = cv2.imread(IMROOT + "fruits.jpg") mono = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY) clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8)) equ = clahe.apply(mono) plt.style.use('default') plt.imshow(mono, cmap='gray') plt.show() plt.imshow(equ, cmap='gray') plt.show() plt.hist(mono.ravel(), 256, [0, 256]) plt.show() plt.hist(equ.ravel(), 256, [0, 256]) plt.show()
ヒストグラムが表示されるので確認.
import os import numpy as np import cv2 %matplotlib inline import matplotlib.pyplot as plt import warnings warnings.filterwarnings('ignore') # Suppress Matplotlib warnings IMROOT=os.environ['LOCALAPPDATA'] + '/' bgr = cv2.imread(IMROOT + "home.jpg") mono = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY) clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8)) equ = clahe.apply(mono) plt.style.use('default') plt.imshow(mono, cmap='gray') plt.show() plt.imshow(equ, cmap='gray') plt.show()
画像が表示されるので確認.
今度は、ヒストグラムを表示する
import os import numpy as np import cv2 %matplotlib inline import matplotlib.pyplot as plt import warnings warnings.filterwarnings('ignore') # Suppress Matplotlib warnings IMROOT=os.environ['LOCALAPPDATA'] + '/' bgr = cv2.imread(IMROOT + "home.jpg") mono = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY) clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8)) equ = clahe.apply(mono) plt.style.use('default') plt.imshow(mono, cmap='gray') plt.show() plt.imshow(equ, cmap='gray') plt.show() plt.hist(mono.ravel(), 256, [0, 256]) plt.show() plt.hist(equ.ravel(), 256, [0, 256]) plt.show()
ヒストグラムが表示されるので確認.
画像などをプロットする. ここでは Jupyter Qt Console を使用して,プロットを行う
jupyter qtconsole
import os import numpy as np import cv2 %matplotlib inline import matplotlib.pyplot as plt import warnings warnings.filterwarnings('ignore') # Suppress Matplotlib warnings IMROOT=os.environ['LOCALAPPDATA'] + '/' bgr = cv2.imread(IMROOT + "fruits.jpg") mono = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY) h,w = mono.shape for i in range(30000): x = np.random.randint(w) y = np.random.randint(h) mono[y][x] = np.random.randint(255) plt.style.use('default') plt.imshow(cv2.cvtColor(bgr, cv2.COLOR_BGR2RGB)) plt.show() plt.imshow(mono, cmap='gray') plt.show()
画像が表示されるので確認.
濃淡画像には、「cv2.fastNlMeansDenoising」を使う. カラー画像に対しては,「cv2.fastNlMeansDenoisingColored」を使う. ビデオの場合には 「cv2.fastNlMeansDenoisingMulti」を使う. ここでは、一度ノイズを加えてから、処理を行っている.
画像などをプロットする. ここでは Jupyter Qt Console を使用して,プロットを行う
jupyter qtconsole
import os import numpy as np import cv2 %matplotlib inline import matplotlib.pyplot as plt import warnings warnings.filterwarnings('ignore') # Suppress Matplotlib warnings IMROOT=os.environ['LOCALAPPDATA'] + '/' bgr = cv2.imread(IMROOT + "fruits.jpg") mono = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY) h,w = mono.shape for i in range(30000): x = np.random.randint(w) y = np.random.randint(h) mono[y][x] = np.random.randint(255) dst = cv2.fastNlMeansDenoising(mono, None, 30, 10, 7) plt.style.use('default') plt.imshow(cv2.cvtColor(bgr, cv2.COLOR_BGR2RGB)) plt.show() plt.imshow(mono, cmap='gray') plt.show() plt.imshow(dst, cmap='gray') plt.show()
画像が表示されるので確認.
2値化は,画像を変換して,全ての画素が 2値になるようにすること.2値化された画像の表示は,白と黒で行っている.
画像などをプロットする. ここでは Jupyter Qt Console を使用して,プロットを行う
jupyter qtconsole
import os import numpy as np import cv2 %matplotlib inline import matplotlib.pyplot as plt import warnings warnings.filterwarnings('ignore') # Suppress Matplotlib warnings IMROOT=os.environ['LOCALAPPDATA'] + '/' bgr = cv2.imread(IMROOT + "fruits.jpg") mono = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY) r, dst = cv2.threshold(mono, 0, 255, cv2.THRESH_OTSU) plt.style.use('default') plt.imshow(cv2.cvtColor(bgr, cv2.COLOR_BGR2RGB)) plt.show() plt.imshow(mono, cmap='gray') plt.show() plt.imshow(dst, cmap='gray') plt.show()
画像が表示されるので確認.
import os import numpy as np import cv2 %matplotlib inline import matplotlib.pyplot as plt import warnings warnings.filterwarnings('ignore') # Suppress Matplotlib warnings IMROOT=os.environ['LOCALAPPDATA'] + '/' bgr = cv2.imread(IMROOT + "home.jpg") mono = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY) r, dst = cv2.threshold(mono, 0, 255, cv2.THRESH_OTSU) plt.style.use('default') plt.imshow(cv2.cvtColor(bgr, cv2.COLOR_BGR2RGB)) plt.show() plt.imshow(mono, cmap='gray') plt.show() plt.imshow(dst, cmap='gray') plt.show()
画像が表示されるので確認.
ここでの輪郭抽出は、2値化の結果を利用して輪郭を抽出している
OpenCV 4 では「contours, hierarchy = cv2.findContours ...」を使う。 OpenCV 3 では「image, contours, hierarchy = cv2.findContours」を使う
画像などをプロットする. ここでは Jupyter Qt Console を使用して,プロットを行う
jupyter qtconsole
import os import numpy as np import cv2 %matplotlib inline import matplotlib.pyplot as plt import warnings warnings.filterwarnings('ignore') # Suppress Matplotlib warnings IMROOT=os.environ['LOCALAPPDATA'] + '/' bgr = cv2.imread(IMROOT + "fruits.jpg") mono = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY) r, dst = cv2.threshold(mono, 0, 255, cv2.THRESH_OTSU) # image, contours, hierarchy = cv2.findContours(dst, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) contours, hierarchy = cv2.findContours(dst, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) plt.style.use('default') plt.imshow(cv2.cvtColor(bgr, cv2.COLOR_BGR2RGB)) plt.show() plt.imshow(mono, cmap='gray') plt.show() plt.imshow(dst, cmap='gray') plt.show() cv2.drawContours(bgr, contours, -1, (0, 255, 0), 3) plt.imshow(cv2.cvtColor(bgr, cv2.COLOR_BGR2RGB)) plt.show()
画像が表示されるので確認.
別の画像で試す
import os import numpy as np import cv2 %matplotlib inline import matplotlib.pyplot as plt import warnings warnings.filterwarnings('ignore') # Suppress Matplotlib warnings IMROOT=os.environ['LOCALAPPDATA'] + '/' bgr = cv2.imread(IMROOT + "home.jpg") mono = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY) r, dst = cv2.threshold(mono, 0, 255, cv2.THRESH_OTSU) # image, contours, hierarchy = cv2.findContours(dst, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) contours, hierarchy = cv2.findContours(dst, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) plt.style.use('default') plt.imshow(cv2.cvtColor(bgr, cv2.COLOR_BGR2RGB)) plt.show() plt.imshow(mono, cmap='gray') plt.show() plt.imshow(dst, cmap='gray') plt.show() cv2.drawContours(bgr, contours, -1, (0, 255, 0), 3) plt.imshow(cv2.cvtColor(bgr, cv2.COLOR_BGR2RGB)) plt.show()
画像が表示されるので確認.
【関連する外部ページ】 https://end0tknr.hateblo.jp/entry/20171105/1509845707
画像などをプロットする. ここでは Jupyter Qt Console を使用して,プロットを行う
jupyter qtconsole
import os import numpy as np import cv2 %matplotlib inline import matplotlib.pyplot as plt import warnings warnings.filterwarnings('ignore') # Suppress Matplotlib warnings IMROOT=os.environ['LOCALAPPDATA'] + '/' bgr = cv2.imread(IMROOT + "fruits.jpg") mono = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY) d = cv2.goodFeaturesToTrack(mono, 80, 0.01, 5, 3) d = np.int0(d) for i in d: x, y = i.ravel() cv2.circle(mono, (x,y), 3, 255, -1) plt.style.use('default') plt.imshow(cv2.cvtColor(bgr, cv2.COLOR_BGR2RGB)) plt.show() plt.imshow(mono, cmap='gray') plt.show()
トラッキングポイントが表示される
import os import numpy as np import cv2 %matplotlib inline import matplotlib.pyplot as plt import warnings warnings.filterwarnings('ignore') # Suppress Matplotlib warnings IMROOT=os.environ['LOCALAPPDATA'] + '/' bgr = cv2.imread(IMROOT + "home.jpg") mono = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY) d = cv2.goodFeaturesToTrack(mono, 80, 0.01, 5, 3) d = np.int0(d) for i in d: x, y = i.ravel() cv2.circle(mono, (x,y), 3, 255, -1) plt.style.use('default') plt.imshow(cv2.cvtColor(bgr, cv2.COLOR_BGR2RGB)) plt.show() plt.imshow(mono, cmap='gray') plt.show()
トラッキングポイントが表示される