快適なC++生活のためにスクリプト言語を使おう - OpenCV C++でプロトタイピングしない理由 -


OpenCV C++でプロトタイピングしない理由

以下の記述の中では
import matplotlib.pyplot as plt
としてmatplotlibを利用していることを想定する記述となっています。

人の視覚特性では、グレースケール画像で細かい値の変化を読むことができません。
人の視覚特性では、グレースケール画像から数値を読み取ることができません。

  • C++ cv::imshow(); : grayscale画像を表示すると、グレーの濃淡で表示する[1]。
  • plt.imshow(): 様々なカラーマッピングで表示できる。

  • C++ cv::imshow(); : 0-255のそれぞれに対して予め決められた濃淡で表示される。

  • plt.imshow(gray, vmin=0, vmax=128)などと表示の範囲を指定できる。

C++ cv::imshow(); では、マルチプロットをすることができません。
アルゴリズムを構築する時点では、A4程度の出力に多数の画像を表示したくなります。
そのとき、1つの画像しか表示できないのは、不便です。

C++ cv::imshow(); では、画像の表示に対して、タイトルや、ラベルを付けたりすることができません。
アルゴリズムを構築する時点では、それぞれの画像、グラフが何を示しているのか、ファイル名や、縦軸や横軸の説明を書かないと、アルゴリズムの開発者自身にとっても理解できないものとなってしまいます。

OpenCV はグラフを書くライブラリを持っていません。

以下のようなプロットのグラフをOpenCVで書こうとしてはいけません。

plt.plot(X, Y, 'ro')
plt.xlabel("x")
plt.ylabel("y")
plt.grid(True)

[1] 最近のOpenCVにはapplyColorMap
がある。Pythonのバインディングもあり、次のコードが動作した。
>>> cv2.__version__
'2.4.11'

ex_applyColorMap.py
import cv2
import numpy as np
img = cv2.imread("lena.png", 0)
b = np.zeros(img.shape[:2], dtype=np.uint8)
jet = cv2.applyColorMap(img, cv2.COLORMAP_JET)
cv2.imwrite("jet.png", jet)

生成した画像

しかしながら、cv2.imshow()とplt.imshow()には、次のように圧倒的な違いがあり、その違いを埋めることできません。

例:plt.colorbar(jet)のときに、欠損値をNaNで扱って表示する(欠損部分は白で表示)ことができますが、
cv2.imshow()はNaNを代入しても、欠損値を黒で表示するので、欠損値とゼロとの区別をすることができません。

imshow(...)
    imshow(winname, mat) -> None
imshow(X, cmap=None, norm=None, aspect=None, interpolation=None, alpha=None, vmin=None, vmax=None, origin=None, extent=None, shape=None, filternorm=1, filterrad=4.0, imlim=None, resample=None, url=None, hold=None, **kwargs)
    Display an image on the axes.