金子邦彦研究室人工知能OpenCV 4 の Python プログラムOpenCV で濃淡画像を使う(イメージヒストグラム,ヒストグラム平坦化,ノイズ除去,2値化,輪郭抽出)(OpenCV,Python を使用)

OpenCV で濃淡画像を使う(イメージヒストグラム,ヒストグラム平坦化,ノイズ除去,2値化,輪郭抽出)(OpenCV,Python を使用)

大学で使用した自作の資料等を,手直しの上公開している. クリエイティブ・コモンズ BY NC SA.

ねらい:OpenCV を用いて,コンピュータビジョンの基本を体験し演習する.

目次

【サイト内の OpenCV 関連ページ】

【OpenCV の公式情報】

前準備

Python のインストール(Windows 上)

サイト内の関連ページ

関連する外部ページ

Python の公式ページ: https://www.python.org/

OpenCV Python のインストール

Python で OpenCV を動かすためのもの.

OpenCV Python のインストールは:別ページ »で説明1~2 コマンドの実行でインストールできる.

画像ファイル fruits.jpg, home.jpg のダウンロード

https://github.com/opencv/opencv/tree/master/samples/data で公開されている fruits.jpg, home.jpg を使用する(謝辞:画像の作者に感謝します)

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

画像やイメージヒストグラムをプロットする.

  1. Windows, Ubuntu, RaspberryPi の場合

    Jupyter Qt Consoleを起動

    jupyter qtconsole
    
  2. 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()
    

    [image]
  3. 別の画像で試す

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

    [image]

イメージヒストグラム

ここでのイメージヒストグラムは,画素の明るさによるヒストグラム.横軸が明るさ(右に行くほど明るい).縦軸が画素数.

画像やイメージヒストグラムをプロットする. ここでは Jupyter Qt Console を使用して,プロットを行う

  1. Windows, Ubuntu, RaspberryPi の場合

    Jupyter Qt Consoleを起動

    jupyter qtconsole
    

    [image]
  2. 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() 
    

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

    [image]
  3. 別の画像でイメージヒストグラムのプロット

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

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

    [image]

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

ヒストグラム平坦化は、モノクロ画像の表示をあざやかにするなどで役に立つ方法. イメージヒストグラムが平坦化するように,画素の輝度を調整する.

画像などをプロットする. ここでは Jupyter Qt Console を使用して,プロットを行う

  1. Windows, Ubuntu, RaspberryPi の場合

    Jupyter Qt Consoleを起動

    jupyter qtconsole
    

    [image]
  2. 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()
    

    画像が表示されるので確認.

    [image]

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

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

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

    [image]
  3. 別の画像で試す

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

    画像が表示されるので確認.

    [image]

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

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

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

    [image]

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

CLAHE は,輪郭線が、残りやすくなるようなヒストグラム平坦化とされる.

画像などをプロットする. ここでは Jupyter Qt Console を使用して,プロットを行う

  1. Windows, Ubuntu, RaspberryPi の場合

    Jupyter Qt Consoleを起動

    jupyter qtconsole
    

    [image]
  2. 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()
    

    画像が表示されるので確認.

    [image]

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

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

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

    [image]
  3. 別の画像で試す

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

    画像が表示されるので確認.

    [image]

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

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

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

    [image]

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

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

画像などをプロットする. ここでは Jupyter Qt Console を使用して,プロットを行う

  1. Windows, Ubuntu, RaspberryPi の場合

    Jupyter Qt Consoleを起動

    jupyter qtconsole
    

    [image]
  2. 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()
    

    画像が表示されるので確認.

    [image]

ノイズ除去

濃淡画像には、「cv2.fastNlMeansDenoising」を使う. カラー画像に対しては,「cv2.fastNlMeansDenoisingColored」を使う. ビデオの場合には 「cv2.fastNlMeansDenoisingMulti」を使う. ここでは、一度ノイズを加えてから、処理を行っている.

画像などをプロットする. ここでは Jupyter Qt Console を使用して,プロットを行う

  1. Windows, Ubuntu, RaspberryPi の場合

    Jupyter Qt Consoleを起動

    jupyter qtconsole
    

    [image]
  2. 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()
    

    画像が表示されるので確認.

    [image]

OTSU の方法による2値化

2値化は,画像を変換して,全ての画素が 2値になるようにすること.2値化された画像の表示は,白と黒で行っている.

画像などをプロットする. ここでは Jupyter Qt Console を使用して,プロットを行う

  1. Windows, Ubuntu, RaspberryPi の場合

    Jupyter Qt Consoleを起動

    jupyter qtconsole
    

    [image]
  2. 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()
    

    画像が表示されるので確認.

    [image]
  3. 別の画像で試す

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

    画像が表示されるので確認.

    [image]

輪郭抽出

ここでの輪郭抽出は、2値化の結果を利用して輪郭を抽出している

OpenCV 4 では「contours, hierarchy = cv2.findContours ...」を使う。 OpenCV 3 では「image, contours, hierarchy = cv2.findContours」を使う

画像などをプロットする. ここでは Jupyter Qt Console を使用して,プロットを行う

  1. Windows, Ubuntu, RaspberryPi の場合

    Jupyter Qt Consoleを起動

    jupyter qtconsole
    

    [image]
  2. 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()
    

    画像が表示されるので確認.

    [image]

    別の画像で試す

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

    画像が表示されるので確認.

    [image]

    関連する外部ページhttps://end0tknr.hateblo.jp/entry/20171105/1509845707

トラッキングポイント(Shi-Tomasi の手法)

画像などをプロットする. ここでは Jupyter Qt Console を使用して,プロットを行う

  1. Windows, Ubuntu, RaspberryPi の場合

    Jupyter Qt Consoleを起動

    jupyter qtconsole
    

    [image]
  2. 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()
    

    トラッキングポイントが表示される

    [image]
  3. 別の画像で試す

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

    トラッキングポイントが表示される

    [image]