OpenCVの-python-研究では、13(画像勾配を)ノート

 

勾配とは何ですか?グラデーションは、単に誘導体です。検出されたエッジ画像の誘導体。

本明細書で使用する場合、パラメータ

SRC 入力画像。                                                                                                                          
DST 同じサイズ、入力画像の同じチャンネル数を有する出力画像
ddepth

出力画像の深さは、参照  組合せを、異なる入力画像に対して、異なる深さでの出力画像を、次のように

入力深さ(src.depth() 出力深さ(ddepth)
CV_8U -1 / CV_16S / CV_32F / CV_64F
CV_16U / CV_16S -1 / CV_32F / CV_64F                                                                                                
CV_32F -1 / CV_32F / CV_64F
CV_64F -1 / CV_64F                      
DX x方向の誘導体注文、x方向にDY = 0誘導体達成するため= 1 DXすることが可能です
二つ 誘導体y方向を注文、= 0をDXすることが可能で、Y方向を達成するため= 1つの誘導体DY
KSIZへ カーネルサイズは、1、3、5、または7を払わなければなりません。
規模 ズームサイズ、デフォルト1
デルタ インクリメント値は、デフォルトで0。DSTに格納する前に、結果に追加されるオプションのデルタ値。
borderType デフォルトの境界型BORDER_DEFAULT、参照  BorderTypes

原則

ソーベル、ラプラシアンScharr:OpenCVのは、3つの異なる勾配フィルタ、またはハイパスフィルタを提供します。

ソーベル、Scharr実際には、第一または第二の導関数を求めています。Scharrは、ソーベルの最適化(畳み込みカーネル小さな勾配角ソリューションソリューションを使用して)されます。ラプラシアンは、二次導関数です。

1.SobelとScharrデリバティブ

ソーベル関節ガウス平滑化プラス微分演算ので、優れたノイズ耐性を有します。あなたは(xorderまたはyorder)の導出の方向を設定することができます。また、畳み込みカーネル(ksize)のサイズを設定するために使用することができます。

機能:

DST = cv.Sobel(SRC、ddepth、DX、DY [、DST [、ksize [スケール〔、デルタ[、borderType]]]]])

 

関数の説明:

第一、第二、第三の混合画像データ又はパイロット計算拡張を使用してソーベル演算子。全てksize×ksize分離コアコンピューティング誘導体を使用している場合を除い。場合時間ksize = 1、使用
。3 × 1  または  1 × 3つの核(即ち、なしガウス平滑化)、ksize = 1は、x軸またはy軸の第一又は第二導関数のために使用することができます。= -1、Scharr ksizeの3×3フィルタの特殊な利用価値は、それがそう常にScharrを使用すべきフィルタ3×3のフィルタを使用する場合、3×3ソーベルウェルフィルター(同じ速度よりも効果的である、あります)、また、この時間cv2.Laplacian(SRC、ddepth、DST、で使用することができる ksize、スケール、デルタ、borderType) 機能。

 

ガウシアン平滑化および分化を組み合わせるSobelオペレータ、特定のノイズの結果の阻害。典型的には、機能を有する(xorder = 1、yorder = 0、ksize = 3)または(xorder = 0、yorder = 1、ksize = 3)画像xまたはyの一次導関数を計算します

 

最初のケースに相当します。

第二の場合は、に対応します。

 

2.ラプラシアンデリバティブ

定義されたラプラシアン直接ソーベル、ラプラシアンオペレータ中性子をOpenCVのコールを計算する際に、実際には、同様の二次離散ソーベル誘導体を達成すると仮定することができる第二の誘導体の形態で使用することができます。それは次のように計算されます。

 

ksize = 1の場合、フィルタに次のカーネルを使用します

機能:

 DST = cv.Laplacian(SRC、ddepth [、DST [、ksize [スケール〔、デルタ[、borderType]]]]])

 

関数の説明:

計算X Sobelオペレータを用いて、第2の機能は、Yは、誘導体は、ラプラシアンソース画像を加算することによって計算されます。

 

これが行われたときksize> 1。ラプラシアン行列を次のように場合ksize == 1は、3×3のフィルタ演算の画像の貫通開口部です。

 

 例えば

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt

img = cv.imread('1.jpg', 0)
laplacian = cv.Laplacian(img, cv.CV_64F)
sobelx = cv.Sobel(img, cv.CV_64F, 1, 0, ksize=5)
sobely = cv.Sobel(img, cv.CV_64F, 0, 1, ksize=5)
plt.subplot(2, 2, 1), plt.imshow(img, cmap='gray')
plt.title('Original'), plt.xticks([]), plt.yticks([])
plt.subplot(2, 2, 2), plt.imshow(laplacian, cmap='gray')
plt.title('Laplacian'), plt.xticks([]), plt.yticks([])
plt.subplot(2, 2, 3), plt.imshow(sobelx, cmap='gray')
plt.title('Sobel X'), plt.xticks([]), plt.yticks([])
plt.subplot(2, 2, 4), plt.imshow(sobely, cmap='gray')
plt.title('Sobel Y'), plt.xticks([]), plt.yticks([])
plt.show()

 

 

 誘導体の境界から黒と白を想像することは整数であり、白から黒のリードに境界点の数が負です。原画像の深さがnp.int8である場合、すべての負の値は切り捨てされて失われた境界に、換言すれば、ゼロになります。あなたはこれらの2つの境界を検出したいのであれば、高い最良の方法は、このようなようにcv2.CV_16S、cv2.CV_64Fとして、出力データ型の設定にあります。そして、絶対値をとり、その後cv2.CV_8Uそれを元に戻します。次の例では、出力画像の異なる深さによって引き起こされる様々な効果を発揮します。

 

おすすめ

転載: www.cnblogs.com/blog-xyy/p/11265624.html