トップページ -> データベース関連技術 -> OpenCV の機能とプログラム例 -> Python + OpenCV で濃淡画像を使う
[サイトマップへ], [サイト内検索へ]

Python + OpenCV で濃淡画像を使う


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

目次

サイト内の関連ページ


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

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

  1. まず、C:\image のような作業用のディレクトリ(フォルダ)を作る

    [image]
  2. 次の Web ページを開く

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

  3. fruits.jpg を選ぶ

    [image]
  4. クリックしたら、ダウンロード画面に変わるので「Download」をクリック.
  5. 画像ファイルを、C:\image の下に保存
  6. 今度は、home.jpg を選ぶ

    [image]
  7. クリックしたら、ダウンロード画面に変わるので「Download」をクリック.
  8. 画像ファイルを、C:\image の下に保存

    [image]

前準備

OpenCV のサンプル画像 fruits.jpg, home.jpg のダウンロード

ダウンロード手順は,「別のページ」で説明している.

Python 3, Python 3 用 opencv-python パッケージのインストール


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

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

  1. まず、C:\image のような作業用のディレクトリ(フォルダ)を作る

    [image]
  2. 次の Web ページを開く

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

  3. fruits.jpg を選ぶ

    [image]
  4. クリックしたら、ダウンロード画面に変わるので「Download」をクリック.
  5. 画像ファイルを、C:\image の下に保存
  6. 今度は、home.jpg を選ぶ

    [image]
  7. クリックしたら、ダウンロード画面に変わるので「Download」をクリック.
  8. 画像ファイルを、C:\image の下に保存

    [image]

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

Python プログラムを動かす.

※ Python プログラムを動かすために, Windows では,「python」コマンドやPythonランチャーである「py」を使う. Ubuntu では「python3」コマンドを使う. あるいは, PyCharmなどにある 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」をクリックしない.画面の中をクリックしてから,何かのキーを押して閉じる

[image]

別の画像で試す

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」をクリックしない.画面の中をクリックしてから,何かのキーを押して閉じる

[image]


イメージヒストグラム

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() 

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

[image]

別の画像で試す

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() 

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

[image]


HOG 特徴量

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 ) 

[image]


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

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

Python プログラムを動かす.

※ Python プログラムを動かすために, Windows では,「python」コマンドやPythonランチャーである「py」を使う. Ubuntu では「python3」コマンドを使う. あるいは, PyCharmなどにある 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」をクリックしない.画面の中をクリックしてから,何かのキーを押して閉じる

[image]

今度は、ヒストグラムを表示する

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() 

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

[image]

別の画像で試す

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」をクリックしない.画面の中をクリックしてから,何かのキーを押して閉じる

[image]

今度は、ヒストグラムを表示する

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() 

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

[image]

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

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

Python プログラムを動かす.

※ Python プログラムを動かすために, Windows では,「python」コマンドやPythonランチャーである「py」を使う. Ubuntu では「python3」コマンドを使う. あるいは, PyCharmなどにある Python コンソールも便利である.

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」をクリックしない.画面の中をクリックしてから,何かのキーを押して閉じる

[image]

今度は、ヒストグラムを表示する

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() 

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

[image]

別の画像で試す

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」をクリックしない.画面の中をクリックしてから,何かのキーを押して閉じる

[image]

今度は、ヒストグラムを表示する

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() 

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

[image]


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

Python プログラムを動かす.

※ Python プログラムを動かすために, Windows では,「python」コマンドやPythonランチャーである「py」を使う. Ubuntu では「python3」コマンドを使う. あるいは, PyCharmなどにある Python コンソールも便利である.

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

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」をクリックしない.画面の中をクリックしてから,何かのキーを押して閉じる

[image]

ノイズ除去

濃淡画像には、「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」をクリックしない.画面の中をクリックしてから,何かのキーを押して閉じる

[image]


OTSU の方法による2値化

import cv2
import numpy as np
IMROOT="C:/image/"
bgr = cv2.imread(IMROOT + "fruits.jpg")
mono = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY)
1r, dst = cv2.threshold(mono, 0, 255, cv2.THRESH_OTSU)o
cv2.imshow("mono", mono)
cv2.imshow("dst", dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

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

[image]

別の画像で試す

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」をクリックしない.画面の中をクリックしてから,何かのキーを押して閉じる

[image]


輪郭抽出

ここでの輪郭抽出は、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」をクリックしない.画面の中をクリックしてから,何かのキーを押して閉じる

[image]

別の画像で試す

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」をクリックしない.画面の中をクリックしてから,何かのキーを押して閉じる

[image]

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


本サイトのサイトマップは,サイトマップのページをご覧下さい. 本サイト内の検索は,サイト内検索のページをご利用下さい.

問い合わせ先: 金子邦彦(かねこ くにひこ) [image]