トップページ -> 最新情報技術の実習と研究ツール -> コンピュータビジョン -> Python + OpenCV で濃淡画像を使う
[サイトマップへ]  

Python + OpenCV で濃淡画像を使う

カラー画像の濃淡画像への変換,

目次


前準備

Anaconda のインストール

前準備として,Python 開発環境のAnaconda のインストールが終わっていること.

Windows での Anaconda のインストール手順は、 別の Web ページに記載しています

Ubuntu での Anaconda のインストール手順は、 別の Web ページに記載しています

以下,Windows に Anaconda をインストール済みであるものとして説明を続けます.

OpenCV, spyder パッケージのインストール

Windows では次の手順で行う

  1. Window でコマンドプロンプトを実行

  2. OpenCV, spyder パッケージのインストール

    ※ 「conda install」は、パッケージをインストールするためのコマンド

    conda install -y spyder opencv 
    

この Web ページで説明のために使用する画像

https://github.com/opencv/opencv/tree/master/samples/data で公開されている fruits.jpg, home.jpg を使うことにします (感謝)

  1. まず、C:\image のような作業用のディレクトリ(フォルダ)を作る
  2. 次の Web ページを開く

    https://github.com/opencv/opencv/tree/master/samples/data

  3. fruits.jpg を選ぶ

  4. クリックしたら、ダウンロード画面に変わるので「Download」をクリック.

  5. 画像ファイルを、C:\image の下に保存

  6. 今度は、home.jpg を選ぶ

  7. クリックしたら、ダウンロード画面に変わるので「Download」をクリック.

  8. 画像ファイルを、C:\image の下に保存

カラー画像から濃淡画像への変換

Python プログラムを動かしたい.

Anacondaに入っている開発環境 spyder を実行し,右下の ipython コンソールを使うのが簡単.

import cv2
img = cv2.imread("C:/image/fruits.jpg")
mono = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imshow("", mono)
cv2.waitKey(0)
cv2.destroyAllWindows()

画像が表示されるので確認. このあと,ウインドウの右上の「x」をクリックしない.画面の中をクリックしてから,何かのキーを押して閉じる

別の画像で試す

import cv2
img = cv2.imread("C:/image/home.jpg")
mono = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imshow("", mono)
cv2.waitKey(0)
cv2.destroyAllWindows()

画像が表示されるので確認. このあと,ウインドウの右上の「x」をクリックしない.画面の中をクリックしてから,何かのキーを押して閉じる


イメージヒストグラム

import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread("C:/image/fruits.jpg")
mono = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
plt.hist(mono.ravel(), 256, [0, 256])
plt.show() 

ヒストグラムが表示されるので確認.

別の画像で試す

import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread("C:/image/home.jpg")
mono = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
plt.hist(mono.ravel(), 256, [0, 256])
plt.show() 

ヒストグラムが表示されるので確認.


ヒストグラム平坦化 (histogram equalization)

ヒストグラム平坦化は、モノクロ画像の表示をあざやかにするなどで役に立つ方法

Python プログラムを動かしたい.

Anacondaに入っている開発環境 spyder を実行し,右下の ipython コンソールを使うのが簡単.

import cv2
img = cv2.imread("C:/image/fruits.jpg")
mono = cv2.cvtColor(img, 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
img = cv2.imread("C:/image/fruits.jpg")
mono = cv2.cvtColor(img, 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
img = cv2.imread("C:/image/home.jpg")
mono = cv2.cvtColor(img, 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
img = cv2.imread("C:/image/home.jpg")
mono = cv2.cvtColor(img, 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() 

ヒストグラムが表示されるので確認.

CLAHE (Contrast Limited Adaptive Histogram Equalization) によるヒストグラム平坦化

輪郭線が、残りやすくなるような工夫

Anacondaに入っている開発環境 spyder を実行し,右下の ipython コンソールを使うのが簡単.

import cv2
img = cv2.imread("C:/image/fruits.jpg")
mono = cv2.cvtColor(img, 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
img = cv2.imread("C:/image/fruits.jpg")
mono = cv2.cvtColor(img, 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
img = cv2.imread("C:/image/home.jpg")
mono = cv2.cvtColor(img, 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
img = cv2.imread("C:/image/home.jpg")
mono = cv2.cvtColor(img, 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() 

ヒストグラムが表示されるので確認.


濃淡画像のノイズを加える、ノイズを除去する

Anacondaに入っている開発環境 spyder を実行し,右下の ipython コンソールを使うのが簡単.

乱数を使ってノイズを加えてみる

import cv2
import numpy as np
img = cv2.imread("C:/image/fruits.jpg")
mono = cv2.cvtColor(img, 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
img = cv2.imread("C:/image/fruits.jpg")
mono = cv2.cvtColor(img, 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」をクリックしない.画面の中をクリックしてから,何かのキーを押して閉じる


OTSU の方法による2値化

import cv2
import numpy as np
img = cv2.imread("C:/image/fruits.jpg")
mono = cv2.cvtColor(img, 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
img = cv2.imread("C:/image/home.jpg")
mono = cv2.cvtColor(img, 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値化の結果を利用して輪郭を抽出している

import cv2
import numpy as np
img = cv2.imread("C:/image/fruits.jpg")
mono = cv2.cvtColor(img, 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) 
cv2.imshow("dst", dst)
cv2.drawContours(img, contours, -1, (0, 255, 0), 3)
cv2.imshow("img", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

画像が表示されるので確認. このあと,ウインドウの右上の「x」をクリックしない.画面の中をクリックしてから,何かのキーを押して閉じる

別の画像で試す

import cv2
import numpy as np
img = cv2.imread("C:/image/home.jpg")
mono = cv2.cvtColor(img, 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) 
cv2.imshow("dst", dst)
cv2.drawContours(img, contours, -1, (0, 255, 0), 3)
cv2.imshow("img", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

画像が表示されるので確認. このあと,ウインドウの右上の「x」をクリックしない.画面の中をクリックしてから,何かのキーを押して閉じる

参考 Web ページ: http://end0tknr.hateblo.jp/entry/20171105/1509845707