OpenCV で濃淡画像を使う(イメージヒストグラム,ヒストグラム平坦化,ノイズ除去,2値化,輪郭抽出)(OpenCV,Python を使用)
ねらい:OpenCV を用いて,コンピュータビジョンの基本を体験し演習する.
【目次】
- 前準備
- このページで説明のために使用する画像
- カラー画像から濃淡画像への変換
- イメージヒストグラム
- ヒストグラム平坦化 (histogram equalization)
- 濃淡画像のノイズを加える、ノイズを除去する
- OTSU の方法による2値化
- 輪郭抽出
【サイト内の OpenCV 関連ページ】
- OpenCV について [PDF] , [パワーポイント]
- OpenCV のインストール,画像表示を行う C++ プログラムの実行手順: 別ページ »で説明
- OpenCVとPythonを活用した画像・ビデオ処理プログラム: 別ページ »にまとめ
- OpenCV 4 の C/C++ プログラム: 別ページ »にまとめている.
【OpenCV の公式情報】
- OpenCV の公式ページ: https://opencv.org
- GitHub の OpenCV のページ: https://github.com/opencv/opencv/releases
前準備
Python のインストールと必要なPythonライブラリのインストール(Windows上)
- Python のインストール
注:既にPython(バージョン3.12を推奨)がインストール済みの場合は,この手順は不要である.
winget(Windowsパッケージマネージャー)を使用してインストールを行う
- 必要なPythonライブラリのインストール
【関連する外部ページ】
【サイト内の関連ページ】
画像ファイル fruits.jpg, home.jpg のダウンロード
https://github.com/opencv/opencv/tree/master/samples/data で公開されている fruits.jpg, home.jpg を使用する(謝辞:画像の作者に感謝します)
- Windows の場合
次のコマンドを実行.
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
- Ubuntu, RaspberryPi の場合
次のコマンドを実行.
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
- Google Colaboratory の場合
次のコマンドを実行.
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
カラー画像から濃淡画像への変換
画像やイメージヒストグラムをプロットする.
- Windows,
Ubuntu, RaspberryPi の場合
jupyter qtconsole
- Python プログラムの実行
Ubuntu, RaspberryPi のときは,「IMROOT=os.environ['LOCALAPPDATA'] + '/'」の行を,「IMROOT="/usr/local/image/"」のように書き換える. Google Colaboratory のときは,「IMROOT=os.environ['LOCALAPPDATA'] + '/'」の行を,「IMROOT="./"」のように書き換える.
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()
- 別の画像で試す
Ubuntu, RaspberryPi のときは,「IMROOT=os.environ['LOCALAPPDATA'] + '/'」の行を,「IMROOT="/usr/local/image/"」のように書き換える. Google Colaboratory のときは,「IMROOT=os.environ['LOCALAPPDATA'] + '/'」の行を,「IMROOT="./"」のように書き換える.
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 を使用して,プロットを行う
- Windows,
Ubuntu, RaspberryPi の場合
jupyter qtconsole
- Python プログラムの実行
Ubuntu, RaspberryPi のときは,「IMROOT=os.environ['LOCALAPPDATA'] + '/'」の行を,「IMROOT="/usr/local/image/"」のように書き換える. Google Colaboratory のときは,「IMROOT=os.environ['LOCALAPPDATA'] + '/'」の行を,「IMROOT="./"」のように書き換える.
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()
ヒストグラムが表示されるので確認.
- 別の画像でイメージヒストグラムのプロット
Ubuntu, RaspberryPi のときは,「IMROOT=os.environ['LOCALAPPDATA'] + '/'」の行を,「IMROOT="/usr/local/image/"」のように書き換える. Google Colaboratory のときは,「IMROOT=os.environ['LOCALAPPDATA'] + '/'」の行を,「IMROOT="./"」のように書き換える.
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()
ヒストグラムが表示されるので確認.
ヒストグラム平坦化 (histogram equalization)
ヒストグラム平坦化は、モノクロ画像の表示をあざやかにするなどで役に立つ方法. イメージヒストグラムが平坦化するように,画素の輝度を調整する.
画像などをプロットする. ここでは Jupyter Qt Console を使用して,プロットを行う
- Windows,
Ubuntu, RaspberryPi の場合
jupyter qtconsole
- Python プログラムの実行
Ubuntu, RaspberryPi のときは,「IMROOT=os.environ['LOCALAPPDATA'] + '/'」の行を,「IMROOT="/usr/local/image/"」のように書き換える. Google Colaboratory のときは,「IMROOT=os.environ['LOCALAPPDATA'] + '/'」の行を,「IMROOT="./"」のように書き換える.
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()
画像が表示されるので確認.
今度は、ヒストグラムを表示する
Ubuntu, RaspberryPi のときは,「IMROOT=os.environ['LOCALAPPDATA'] + '/'」の行を,「IMROOT="/usr/local/image/"」のように書き換える. Google Colaboratory のときは,「IMROOT=os.environ['LOCALAPPDATA'] + '/'」の行を,「IMROOT="./"」のように書き換える.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()
ヒストグラムが表示されるので確認.
- 別の画像で試す
Ubuntu, RaspberryPi のときは,「IMROOT=os.environ['LOCALAPPDATA'] + '/'」の行を,「IMROOT="/usr/local/image/"」のように書き換える. Google Colaboratory のときは,「IMROOT=os.environ['LOCALAPPDATA'] + '/'」の行を,「IMROOT="./"」のように書き換える.
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()
画像が表示されるので確認.
今度は、ヒストグラムを表示する
Ubuntu, RaspberryPi のときは,「IMROOT=os.environ['LOCALAPPDATA'] + '/'」の行を,「IMROOT="/usr/local/image/"」のように書き換える. Google Colaboratory のときは,「IMROOT=os.environ['LOCALAPPDATA'] + '/'」の行を,「IMROOT="./"」のように書き換える.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 (Contrast Limited Adaptive Histogram Equalization) によるヒストグラム平坦化
CLAHE は,輪郭線が、残りやすくなるようなヒストグラム平坦化とされる.
画像などをプロットする. ここでは Jupyter Qt Console を使用して,プロットを行う
- Windows,
Ubuntu, RaspberryPi の場合
jupyter qtconsole
- Python プログラムの実行
Ubuntu, RaspberryPi のときは,「IMROOT=os.environ['LOCALAPPDATA'] + '/'」の行を,「IMROOT="/usr/local/image/"」のように書き換える. Google Colaboratory のときは,「IMROOT=os.environ['LOCALAPPDATA'] + '/'」の行を,「IMROOT="./"」のように書き換える.
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()
画像が表示されるので確認.
今度は、ヒストグラムを表示する
Ubuntu, RaspberryPi のときは,「IMROOT=os.environ['LOCALAPPDATA'] + '/'」の行を,「IMROOT="/usr/local/image/"」のように書き換える. Google Colaboratory のときは,「IMROOT=os.environ['LOCALAPPDATA'] + '/'」の行を,「IMROOT="./"」のように書き換える.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()
ヒストグラムが表示されるので確認.
- 別の画像で試す
Ubuntu, RaspberryPi のときは,「IMROOT=os.environ['LOCALAPPDATA'] + '/'」の行を,「IMROOT="/usr/local/image/"」のように書き換える. Google Colaboratory のときは,「IMROOT=os.environ['LOCALAPPDATA'] + '/'」の行を,「IMROOT="./"」のように書き換える.
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()
画像が表示されるので確認.
今度は、ヒストグラムを表示する
Ubuntu, RaspberryPi のときは,「IMROOT=os.environ['LOCALAPPDATA'] + '/'」の行を,「IMROOT="/usr/local/image/"」のように書き換える. Google Colaboratory のときは,「IMROOT=os.environ['LOCALAPPDATA'] + '/'」の行を,「IMROOT="./"」のように書き換える.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 を使用して,プロットを行う
- Windows,
Ubuntu, RaspberryPi の場合
jupyter qtconsole
- Python プログラムの実行
Ubuntu, RaspberryPi のときは,「IMROOT=os.environ['LOCALAPPDATA'] + '/'」の行を,「IMROOT="/usr/local/image/"」のように書き換える. Google Colaboratory のときは,「IMROOT=os.environ['LOCALAPPDATA'] + '/'」の行を,「IMROOT="./"」のように書き換える.
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 を使用して,プロットを行う
- Windows,
Ubuntu, RaspberryPi の場合
jupyter qtconsole
- Python プログラムの実行
Ubuntu, RaspberryPi のときは,「IMROOT=os.environ['LOCALAPPDATA'] + '/'」の行を,「IMROOT="/usr/local/image/"」のように書き換える. Google Colaboratory のときは,「IMROOT=os.environ['LOCALAPPDATA'] + '/'」の行を,「IMROOT="./"」のように書き換える.
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()
画像が表示されるので確認.
OTSU の方法による2値化
2値化は,画像を変換して,全ての画素が 2値になるようにすること.2値化された画像の表示は,白と黒で行っている.
画像などをプロットする. ここでは Jupyter Qt Console を使用して,プロットを行う
- Windows,
Ubuntu, RaspberryPi の場合
jupyter qtconsole
- Python プログラムの実行
Ubuntu, RaspberryPi のときは,「IMROOT=os.environ['LOCALAPPDATA'] + '/'」の行を,「IMROOT="/usr/local/image/"」のように書き換える. Google Colaboratory のときは,「IMROOT=os.environ['LOCALAPPDATA'] + '/'」の行を,「IMROOT="./"」のように書き換える.
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()
画像が表示されるので確認.
- 別の画像で試す
Ubuntu, RaspberryPi のときは,「IMROOT=os.environ['LOCALAPPDATA'] + '/'」の行を,「IMROOT="/usr/local/image/"」のように書き換える. Google Colaboratory のときは,「IMROOT=os.environ['LOCALAPPDATA'] + '/'」の行を,「IMROOT="./"」のように書き換える.
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 を使用して,プロットを行う
- Windows,
Ubuntu, RaspberryPi の場合
jupyter qtconsole
- Python プログラムの実行
Ubuntu, RaspberryPi のときは,「IMROOT=os.environ['LOCALAPPDATA'] + '/'」の行を,「IMROOT="/usr/local/image/"」のように書き換える. Google Colaboratory のときは,「IMROOT=os.environ['LOCALAPPDATA'] + '/'」の行を,「IMROOT="./"」のように書き換える.
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()
画像が表示されるので確認.
別の画像で試す
Ubuntu, RaspberryPi のときは,「IMROOT=os.environ['LOCALAPPDATA'] + '/'」の行を,「IMROOT="/usr/local/image/"」のように書き換える. Google Colaboratory のときは,「IMROOT=os.environ['LOCALAPPDATA'] + '/'」の行を,「IMROOT="./"」のように書き換える.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
トラッキングポイント(Shi-Tomasi の手法)
画像などをプロットする. ここでは Jupyter Qt Console を使用して,プロットを行う
- Windows,
Ubuntu, RaspberryPi の場合
jupyter qtconsole
- Python プログラムの実行
Ubuntu, RaspberryPi のときは,「IMROOT=os.environ['LOCALAPPDATA'] + '/'」の行を,「IMROOT="/usr/local/image/"」のように書き換える. Google Colaboratory のときは,「IMROOT=os.environ['LOCALAPPDATA'] + '/'」の行を,「IMROOT="./"」のように書き換える.
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()
トラッキングポイントが表示される
- 別の画像で試す
Ubuntu, RaspberryPi のときは,「IMROOT=os.environ['LOCALAPPDATA'] + '/'」の行を,「IMROOT="/usr/local/image/"」のように書き換える. Google Colaboratory のときは,「IMROOT=os.environ['LOCALAPPDATA'] + '/'」の行を,「IMROOT="./"」のように書き換える.
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()
トラッキングポイントが表示される