目次
サイト内の関連Webページ
前準備として,Python 開発環境のAnaconda のインストールが終わっていること.
以下,Windows に Anaconda をインストール済みであるものとして説明を続けます.
Windows では次の手順で行う
※ 「conda install」は、パッケージをインストールするためのコマンド
conda install -y spyder opencv
https://github.com/opencv/opencv/tree/master/samples/data で公開されている fruits.jpg, home.jpg を使うことにします (感謝)
https://github.com/opencv/opencv/tree/master/samples/data
Python プログラムを動かしたい.
import cv2
IMROOT="C:/image/"
bgr = cv2.imread(IMROOT + fruits.jpg")
mono = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY)
cv2.imshow("", mono)
cv2.waitKey(0)
cv2.destroyAllWindows()
画像が表示されるので確認. このあと,ウインドウの右上の「x」をクリックしない.画面の中をクリックしてから,何かのキーを押して閉じる
別の画像で試す
import cv2
IMROOT="C:/image/"
bgr = cv2.imread(IMROOT + "home.jpg")
mono = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY)
cv2.imshow("", mono)
cv2.waitKey(0)
cv2.destroyAllWindows()
画像が表示されるので確認. このあと,ウインドウの右上の「x」をクリックしない.画面の中をクリックしてから,何かのキーを押して閉じる
import cv2 import numpy as np from matplotlib import pyplot as plt IMROOT="C:/image/" bgr = cv2.imread(IMROOT + "fruits.jpg") mono = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY) plt.hist(mono.ravel(), 256, [0, 256]) plt.show()
ヒストグラムが表示されるので確認.
別の画像で試す
import cv2 import numpy as np from matplotlib import pyplot as plt IMROOT="C:/image/" bgr = cv2.imread(IMROOT + "home.jpg") mono = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY) plt.hist(mono.ravel(), 256, [0, 256]) plt.show()
ヒストグラムが表示されるので確認.
import cv2 import numpy as np hog = cv2.HOGDescriptor() IMROOT="C:/image/" bgr = cv2.imread(IMROOT + "fruits.jpg") mono = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY) descriptor = hog.compute(mono) descriptor = descriptor.ravel() print( hog.getDescriptorSize() ) print( descriptor.size )
ヒストグラム平坦化は、モノクロ画像の表示をあざやかにするなどで役に立つ方法
Python プログラムを動かしたい.
import cv2
IMROOT="C:/image/"
bgr = cv2.imread(IMROOT + "fruits.jpg")
mono = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY)
cv2.imshow("mono", mono)
equ = cv2.equalizeHist(mono)
cv2.imshow("equ", equ)
cv2.waitKey(0)
cv2.destroyAllWindows()
画像が表示されるので確認. このあと,ウインドウの右上の「x」をクリックしない.画面の中をクリックしてから,何かのキーを押して閉じる
今度は、ヒストグラムを表示する
import cv2 import numpy as np from matplotlib import pyplot as plt IMROOT="C:/image/" bgr = cv2.imread(IMROOT + "fruits.jpg") mono = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY) plt.hist(mono.ravel(), 256, [0, 256]) plt.show() equ = cv2.equalizeHist(mono) plt.hist(equ.ravel(), 256, [0, 256]) plt.show()
ヒストグラムが表示されるので確認.
別の画像で試す
import cv2
IMROOT="C:/image/"
bgr = cv2.imread(IMROOT + "home.jpg")
mono = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY)
cv2.imshow("mono", mono)
equ = cv2.equalizeHist(mono)
cv2.imshow("equ", equ)
cv2.waitKey(0)
cv2.destroyAllWindows()
画像が表示されるので確認. このあと,ウインドウの右上の「x」をクリックしない.画面の中をクリックしてから,何かのキーを押して閉じる
今度は、ヒストグラムを表示する
import cv2 import numpy as np from matplotlib import pyplot as plt IMROOT="C:/image/" bgr = cv2.imread(IMROOT + "home.jpg") mono = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY) plt.hist(mono.ravel(), 256, [0, 256]) plt.show() equ = cv2.equalizeHist(mono) plt.hist(equ.ravel(), 256, [0, 256]) plt.show()
ヒストグラムが表示されるので確認.
輪郭線が、残りやすくなるような工夫
import cv2
IMROOT="C:/image/"
bgr = cv2.imread(IMROOT + "fruits.jpg")
mono = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY)
cv2.imshow("mono", mono)
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
equ = clahe.apply(mono)
cv2.imshow("equ", equ)
cv2.waitKey(0)
cv2.destroyAllWindows()
画像が表示されるので確認. このあと,ウインドウの右上の「x」をクリックしない.画面の中をクリックしてから,何かのキーを押して閉じる
今度は、ヒストグラムを表示する
import cv2 import numpy as np from matplotlib import pyplot as plt IMROOT="C:/image/" bgr = cv2.imread(IMROOT + "fruits.jpg") mono = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY) plt.hist(mono.ravel(), 256, [0, 256]) plt.show() clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8)) equ = clahe.apply(mono) plt.hist(equ.ravel(), 256, [0, 256]) plt.show()
ヒストグラムが表示されるので確認.
別の画像で試す
import cv2
IMROOT="C:/image/"
bgr = cv2.imread(IMROOT + "home.jpg")
mono = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY)
cv2.imshow("mono", mono)
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
equ = clahe.apply(mono)
cv2.imshow("equ", equ)
cv2.waitKey(0)
cv2.destroyAllWindows()
画像が表示されるので確認. このあと,ウインドウの右上の「x」をクリックしない.画面の中をクリックしてから,何かのキーを押して閉じる
今度は、ヒストグラムを表示する
import cv2 import numpy as np from matplotlib import pyplot as plt IMROOT="C:/image/" bgr = cv2.imread(IMROOT + "home.jpg") mono = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY) plt.hist(mono.ravel(), 256, [0, 256]) plt.show() clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8)) equ = clahe.apply(mono) plt.hist(equ.ravel(), 256, [0, 256]) plt.show()
ヒストグラムが表示されるので確認.
import cv2
import numpy as np
IMROOT="C:/image/"
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)
cv2.imshow("mono", mono)
cv2.waitKey(0)
cv2.destroyAllWindows()
画像が表示されるので確認. このあと,ウインドウの右上の「x」をクリックしない.画面の中をクリックしてから,何かのキーを押して閉じる
濃淡画像には、「cv2.fastNlMeansDenoising」を使う. カラー画像に対しては,「cv2.fastNlMeansDenoisingColored」を使う. ビデオの場合には 「cv2.fastNlMeansDenoisingMulti」を使う. ここでは、一度ノイズを加えてから、処理を行っている.
import cv2
import numpy as np
IMROOT="C:/image/"
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)
cv2.imshow("mono", mono)
cv2.imshow("dst", dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
画像が表示されるので確認. このあと,ウインドウの右上の「x」をクリックしない.画面の中をクリックしてから,何かのキーを押して閉じる
import cv2
import numpy as np
IMROOT="C:/image/"
bgr = cv2.imread(IMROOT + "fruits.jpg")
mono = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY)
r, dst = cv2.threshold(mono, 0, 255, cv2.THRESH_OTSU)
cv2.imshow("mono", mono)
cv2.imshow("dst", dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
画像が表示されるので確認. このあと,ウインドウの右上の「x」をクリックしない.画面の中をクリックしてから,何かのキーを押して閉じる
別の画像で試す
import cv2
import numpy as np
IMROOT="C:/image/"
bgr = cv2.imread(IMROOT + "home.jpg")
mono = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY)
r, dst = cv2.threshold(mono, 0, 255, cv2.THRESH_OTSU)
cv2.imshow("mono", mono)
cv2.imshow("dst", dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
画像が表示されるので確認. このあと,ウインドウの右上の「x」をクリックしない.画面の中をクリックしてから,何かのキーを押して閉じる
ここでの輪郭抽出は、2値化の結果を利用して輪郭を抽出している
OpenCV 4 では「contours, hierarchy = cv2.findContours ...」を使う。 OpenCV 3 では「image, contours, hierarchy = cv2.findContours」を使う
import cv2
import numpy as np
IMROOT="C:/image/"
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)
cv2.imshow("dst", dst)
cv2.drawContours(bgr, contours, -1, (0, 255, 0), 3)
cv2.imshow("img", bgr)
cv2.waitKey(0)
cv2.destroyAllWindows()
画像が表示されるので確認. このあと,ウインドウの右上の「x」をクリックしない.画面の中をクリックしてから,何かのキーを押して閉じる
別の画像で試す
import cv2
import numpy as np
IMROOT="C:/image/"
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)
cv2.imshow("dst", dst)
cv2.drawContours(bgr, contours, -1, (0, 255, 0), 3)
cv2.imshow("img", bgr)
cv2.waitKey(0)
cv2.destroyAllWindows()
画像が表示されるので確認. このあと,ウインドウの右上の「x」をクリックしない.画面の中をクリックしてから,何かのキーを押して閉じる
参考 Web ページ: http://end0tknr.hateblo.jp/entry/20171105/1509845707