banner
月落星河Tsukistar

月落星河Tsukistar

浩瀚中的伟大,孤独间的渺小
github
twitter
youtube
bilibili
email

opencv-pythonの画像処理の一般的な方法の整理(1)

封面画像はPexelsによってPixabayで公開されており、私は OpenCV のロゴを追加しました。

卒業設計を終えてから、私はもう画像処理に関連するものに触れていませんでした。会社に入ってからはフロントエンド開発として学習と仕事をしていました(それが Vue の学習ノートの理由です)、しかし、再び画像処理に関わることを始めたとき、自分が関数の呼び出し方を完全に忘れていることに気付きました。そのため、整理することにしました。

私はimport cv2 as cvを使うことに慣れているので、以下の呼び出しはすべて cv を基準にしています。フォーマットでは、dst は目標画像の mat オブジェクトであり、src は元の画像の mat オブジェクトです(imread で読み込んだものです)。

画像のサイズを取得する#

src.shape を print すると、結果が(高さ、幅、チャンネル数)となることがわかります。したがって、画像の高さと幅を取得するには、次のステートメントを使用します:

src_height, src_width = src.shape[0:2]

画像のリサイズ関数 resize ()#

一般的な関数のフォーマット:

dst = cv.resize(src, dsize)

ここで、dsize は(int(source_width / 2), int(source_height / 2))のような形式のタプルであり、画像のスケーリング率を表します。例では、縦横比を保ったまま半分に縮小していますが、パラメータは調整可能です。

画像の色変換関数 cvtColor ()#

一般的な関数のフォーマット:

dst = cv.cvtColor(src, colorCode)

ここで、colorCode の部分はライブラリ内で対応するコードがあります。たとえば、cv.COLOR_RGB2GRAYなどです。

この関数は、グレースケールなどによく使用されます。

画像のノイズ低減によく使用されるガウシアンフィルタ GaussianBlur ()#

一般的な関数のフォーマット:

dst = cv.GaussianBlur(src, ksize, sigmaX)

ksize はカーネルのサイズで、正の奇数のタプルでなければなりません。たとえば、(3, 3)、(5, 5) などです。一般的には、ピクセルの周囲の領域で処理を行うための近傍サイズを指します。ksize が大きいほど、よりぼやけた結果が得られます。

sigmaX は実際にはσXであり、画像の X 方向の標準偏差を指します。必須のパラメータであり、σYが指定されていない場合は X に基づいて設定されます。

画像の二値化関数 threshold ()#

一般的な関数のフォーマット:

dst = cv.threshold(src, thresh, maxval, type)

ここで、thresh は閾値、maxval は設定される最大値で、type がcv.THRESH_BINARYまたはcv.THRESH_BINARY_INVの場合にのみ有効です。

type は二値化の方法を指定するもので、ライブラリ内で対応する値があります。以下に示します:

cv.THRESH_BINARY:現在のピクセルが thresh より大きい場合は maxval の値に設定され、それ以外の場合は 0 になります。

cv.THRESH_BINARY_INV:現在のピクセルの値が閾値より大きい場合は 0 に設定され、それ以外の場合は Maxval に設定されます。

THRESH_TRUNC:現在のピクセルの値が閾値より大きい場合は閾値に設定され、それ以外の場合は変更されません。

THRESH_TOZERO:現在のピクセルの値が閾値より大きい場合は変更されず、それ以外の場合は 0 に設定されます。

THRESH_TOZERO_INV:現在のピクセルの値が閾値より大きい場合は 0 に設定され、それ以外の場合は変更されません。

Canny エッジ検出 Canny ()#

一般的な関数のフォーマット:

dst = cv.Canny(src, thresh1, thresh2)

ここで、thresh1 未満のピクセルはエッジではないと見なされ、thresh2 を超えるピクセルはエッジと見なされます。2 つの閾値の間の値を持つピクセルがエッジと見なされる場合、それらは隣接するエッジと見なされます。

輪郭検出 findContours () と輪郭描画 drawContours ()#

一般的な関数のフォーマット:

contours, hierarchy = cv.findContours(src, mode, method)
dst = cv.drawContours(src, contours, contoursIdx, color, thickness)

findContours では、mode は輪郭の検索方法を指定し、cv.RETR_TREEなどは輪郭の階層関係を完全に構築します。method は輪郭の表現方法を指定し、cv.CHAIN_APPROX_SIMPLEなどは輪郭をできるだけ少ないピクセルで表現します。

drawContours では、contours は前のステップで検出された輪郭で、contoursIdx は描画する輪郭の番号を指定します。-1 の場合はすべての輪郭を描画します。color は色を指定し、(255, 0, 0) のような形式で RGB の色を表します。thickness は輪郭線の幅で、必須ではありません。

通常、エッジ検出後の画像に対して輪郭検出を行うと、良好な輪郭効果が得られます。

ハフ変換 HoughLines ()#

一般的な関数のフォーマット:

lines = cv.HoughLines(src, rho, theta,thresh)

出力は検出された直線のセットで、rho はピクセル単位の距離の精度、theta はラジアン単位の角度の精度を指定します。ここでは極座標を使用して直線を表します。thresh は閾値です。実際の使用では、特に特別な場合を除いて、通常は 1、np.pi/ 180、0 です。

この関数は直線検出に使用され、角度を求めて直線を正規化するために使用されます。たとえば、以下のコードは直線の傾きに対応する角度で回転します:

lines = cv.HoughLines(img_canny, 1, np.pi / 180, 0)
for rho, theta in lines[0]:
    a = np.cos(theta)
    b = np.sin(theta)
    x0 = a * rho
    y0 = b * rho
    x1 = int(x0 + 1000 * (-b))
    y1 = int(y0 + 1000 * a)
    x2 = int(x0 - 1000 * (-b))
    y2 = int(y0 - 1000 * a)
    if x1 == x2 or y1 == y2:
        continue
    t = float(y2 - y1) / (x2 - x1)
    rotate_angle = math.degrees(math.atan(t))
    img_result = ndimage.rotate(img_resize, rotate_angle)
読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。