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

大学授業用に作成した資料を更新・改良して公開しています.これらは クリエイティブコモンズ 表示-非営利-継承 4.0 国際ライセンス(CC BY-NC-SA 4.0) で提供しており,事前の許可なく自由に利用できます.条件は著作者表示(BY),非営利目的のみ(NC),同一ライセンスでの再配布(SA)です.

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

目次

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

【OpenCV の公式情報】

前準備

Python のインストールと必要なPythonライブラリのインストール(Windows上)

  1. Python のインストール

    注:既にPython(バージョン3.12を推奨)がインストール済みの場合は,この手順は不要である.

    winget(Windowsパッケージマネージャー)を使用してインストールを行う

    1. Windowsで,コマンドプロンプト管理者権限で起動する(例:Windowsキーを押し,「cmd」と入力し,「管理者として実行」を選択)
    2. winget(Windowsパッケージマネージャー)が利用可能か確認する:
      winget --version
      
    3. Pythonのインストール(下のコマンドにより Python 3.12 がインストールされる).
      winget install --scope machine Python.Launcher
      winget install --scope machine Python.Python.3.12
      
  2. 必要なPythonライブラリのインストール
    1. Windowsで,コマンドプロンプト管理者権限で起動する(例:Windowsキーを押し,「cmd」と入力し,「管理者として実行」を選択)
    2. 以下のコマンドを実行し,必要なライブラリをインストールする.
      pip install -U openai
      

【関連する外部ページ】

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

画像ファイル 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()
    
  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()
    

イメージヒストグラム

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

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

  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(mono, cmap='gray')
    plt.show()
    plt.hist(mono.ravel(), 256, [0, 256])
    plt.show()
    

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

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

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

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

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

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

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

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

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

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

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

    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 を使用して,プロットを行う

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

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

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

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

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

    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 を使用して,プロットを行う

  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)
    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 を使用して,プロットを行う

  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)
    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 を使用して,プロットを行う

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

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

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

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

輪郭抽出

ここでの輪郭抽出は、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
    
  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()
    

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

    別の画像で試す

    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 を使用して,プロットを行う

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

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

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

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