記事ディレクトリ
1. エッジ検出演算子の分類
(1)一阶导数的边缘检测算子:
通过模板作为核与图像的每个像素点做卷积和运算,然后选取合适的阈值来提取图像的边缘。常见的有Roberts算子、Sobel算子和Prewitt算子。
(2)二阶导数的边缘算子:
依据于二阶导数过零点,常见的有Laplacian 算子,此类算子对噪声敏感。
(3)Canny算子:
前面两类均是通过微分算子来检测图像边缘,还有一种就是Canny算子,其是在满足一定约束条件下推导出来的边缘检测最优化算子。
2.キャニー演算子コア理論
2.1.Canny オペレーターの簡単な紹介
Canny オペレーターは非常に一般的に使用されるエッジ検出オペレーターであり、そのレンダリングは次のようになります。
2.2. Canny オペレーターのエッジ検出インデックス
Canny オペレーターはエッジ検出に基づいて実装されているため、エッジ検出の指標は次のとおりです。
(1) 良好な信号対雑音比、つまり、非エッジ点をエッジ点として決定する確率が低い。
(2) 高い位置決め。検出されたエッジは実際のエッジの中心にある必要があります。
(3) 単一のエッジに対しては一意の応答のみが存在します。つまり、偽のエッジは最大限に抑制する必要があります。
2.3.Canny オペレーターの基本原則
1.2个条件:一能有效抑制噪声,二能精确定位边缘位置
2.平滑后求导,用高斯滤波器进行平滑
3.用一阶偏导有限差分计算梯度幅值与方向
3.对梯度幅值进行非极大值抑制
4.用双闯值检测与连接边缘
3. Cannyオペレーターの処理フロー
第三部の内容は以下より引用: https://blog.csdn.net/zaishuiyifangxym/article/details/90142702
私の仕事は彼のブログを通じて学ぶことですが、このブロガーの履歴書コラムはとても良いです。
このブログで分からないことがあれば、彼のコラムを読んでみると内容が非常に充実しており、より適切な答えが得られるはずです。
3.1. ノイズを除去するためのガウスフィルタリング
上記のアルゴリズムの第一原理によれば、画像の影響をノイズ除去する必要があります。
ノイズの影響を受けやすい画像のエッジ検出。したがって、通常はエッジ検出の前にノイズ除去が必要です。通常、ガウス フィルタリングはノイズを除去するために使用されます。ガウス フィルタリングは一般的に使用されるノイズ除去関数です。その 5x5 テンプレート式は次の値に対応します: 1 273
× [ 1 4 7 4 1 4 16 26 16 4 7 26 41 26 7 4 16 26 16 4 1 4 7 4 1 ] \frac{1}{273}\times\begin{bmatrix}1&4&7&4&1\\4&16&26&16&4\\7&26&41&26&7\\4&16&26&16&4\\1&4&7&4&1\end{bmatrix}2731×
1474141626164726412674162616414741
Opencv ライブラリのガウス フィルター関数は次のとおりです。
img = cv2.GaussianBlur(src, ksize, sigmaX)
其中,参数:src 表示原始图像;ksize 表示核大小,而且ksize只能是奇数;sigmaX 表示X方向方差。
3.2. 画像のグラデーション検索
コンテンツのこの部分では、勾配の振幅と方向を計算して見つけ、画像の勾配を見つける必要があります。最初に畳み込みテンプレートを x 方向と y 方向にそれぞれ適用し、次に勾配の振幅と方向を計算する必要があります。式は次のとおりです: 畳み込み:
dx = [ − 1 0 1 − 2 0 2 − 1 0 1 ] dy = [ − 1 − 2 − 1 0 0 0 1 2 1 ] 振幅: S = dx 2 + dy 2 方向: θ = arctan ( dydx ) \begin{aligned}畳み込み: d_x&=\begin{bmatrix}-1&0&1 \ \-2&0&2\\-1&0&1\end{bmatrix}\quad d_y=\begin{bmatrix}-1&-2&-1\\0&0&0\\1&2&1\end{bmatrix}\\\\amplitude:S&=\sqrt{ d_x ^2+d_y^2}\\\\ 方向:\theta&=\arctan(\frac{d_y}{d_x})\end{aligned}コンボリューション:d×振幅:S方向:私=
− 1− 2− 1000121
dはい=
− 101− 202− 101
=dバツ2+dy2=アークタン(d×dはい)
計算後に得られた振幅と方向を図に示します。
3.3. 非最大値抑制処理
各ピクセルに対して、次の処理を実行します。非最大抑制テクノロジーを適用して、非エッジ ピクセルをフィルターで除去し、ぼやけた境界を明確にします。このプロセスでは、各ピクセルの勾配強度の最大値が保持され、他の値はフィルターで除去されます。
Step1:将其梯度方向近似为以下值中的一个,包括0、45、90、135、180、225、270和315,即表示上下左右和45度方向。
Step2:比较该像素点和其梯度正负方向的像素点的梯度强度,如果该像素点梯度强度最大则保留,否则抑制(删除,即置为0)。
Step1とStep2の処理方法は図のとおりです。
3.4.二重閾値境界処理
二重閾値境界処理の原理も比較的単純で、非最大抑制画像に 2 つの閾値T low T_{low}を適用します。Tああ、 _和T高 T_{高}Tこんにちは_ _。勾配値をT low T_{low}未満にするTああ、 _ピクセルのグレー値が 0 に設定され、画像 1 が取得されます。次に、勾配値をT high T_{high}より大きくします。Tこんにちは_ _ピクセルのグレースケール値が 0 に設定され、画像 2 が得られます。
画像 2 のしきい値は比較的高いため、ほとんどのノイズは除去されますが、有用なエッジ情報も失われます。画像 1 はしきい値が低く、より多くの情報を保持しているため、画像 2 をベースとして使用し、画像 1 を画像のエッジを接続するための補足として使用できます。
3.5. 境界ラグ技術の追跡
境界ラグ技術の追跡方法に関する研究は、https: //blog.csdn.net/qq_44736333/article/details/109152380から得られます。
2 種類のエッジを想定します。非最大抑制後のエッジ点のうち、勾配値が T1 を超えるものを強エッジ、勾配値が T1 未満および T2 より大きいものを弱いエッジ、および勾配値が T1 を超えるものを弱いエッジと呼びます。 T2 未満の勾配はエッジではありません。
確かなのは、強いエッジはエッジ ポイントである必要があるため、ピクセルの勾配値が十分に大きい (変化が十分に激しい) 必要があるように T1 を十分に高く設定する必要があり、一方、弱いエッジはエッジまたはノイズである可能性があるということです。裁判官?毛織物?
弱いエッジの周囲の 8 つの近傍に強いエッジ ポイントがある場合、弱いエッジ ポイントは強いエッジ ポイントに変換され、強いエッジを補完します。
実際には、T1:T2=2:1 の比率が良いことがわかります。T1 は手動で指定することも、適応的に指定するアルゴリズムを設計することもできます。たとえば、勾配の最初の 30% の分割線などです。ヒストグラムは私が実装した T1 として定義されており、人為的に指定されたしきい値です。
上の図では、白い四角形はエッジ (強いエッジと弱いエッジを含む) の存在を表します。弱いエッジの各ピクセルが走査されます。ピクセルの 8 つの近傍に強いエッジに対応するピクセルがある場合、これは弱いエッジ ピクセルは実際のエッジとして分類されます (視覚的な観点から理解すると、不確実なエッジが存在します。この不確実なエッジの隣に実際のエッジがある場合、このエッジは実際のエッジとして分類されます。そうでない場合は、実際のエッジとして分類されます)。削除されます)
3.6. Canny オペレーターエッジ検出の特徴
1.检出准则: 该准则要求不应丢失重要的边缘,而且不应输出噪声性的多余边缘。
2.定位准则: 该准则要求检测到的边缘位置与实际边缘位置之间的距离为最小。
3.单一响应准则: 该准则在一定程度上多涵盖为检出准则,它要求尽可能减少对于同一边缘出现多个响应的情况。
4. Canny オペレーターのアルゴリズム コード
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 支持中文
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
def All_Canny(img):
grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)#图像灰度化处理
gaussian = cv2.GaussianBlur(grayImage, (5, 5), 0)# 高斯滤波降噪
Canny = cv2.Canny(gaussian, 50, 150)# Canny算子
return grayImage, gaussian,Canny
# 读取图像
img = cv2.imread('lena.jpg')#imread出来的是BRG图像
lenna_img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)#转化为RGB图像
# 显示图形
Figure=All_Canny(img)#获取Canny检测之后的图片
#图像可视化处理
titles = [u'原始图像', u'灰度处理图',u'高斯去噪处理图', u'Canny算子c处理图']
images = [lenna_img ,Figure[0],Figure[1], Figure[2]]
#subplot绘制
#第一张图
plt.subplot(2, 2, 1)
plt.imshow(images[0], 'gray'),plt.title(titles[0])
plt.xticks([]),plt.yticks([])
#第二张图
plt.subplot(2, 2, 2)
plt.imshow(images[1], 'gray'),plt.title(titles[1])
plt.xticks([]),plt.yticks([])
#第三张图
plt.subplot(2, 2, 3)
plt.imshow(images[2], 'gray'),plt.title(titles[2])
plt.xticks([]),plt.yticks([])
#第四张图
plt.subplot(2, 2, 4)
plt.imshow(images[3], 'gray'),plt.title(titles[3])
plt.xticks([]),plt.yticks([])
plt.savefig(r"D:\HuaweiMoveData\Users\27182\Desktop\py\Canny.png",dpi=1000)
plt.show()
5.キャニーオペレーターエフェクト表示
6. 参考記事と謝辞
本章内容的完成离不开以下大佬文章的启发和帮助,在这里列出名单,如果对于内容还有不懂的,可以移步对应的文章进行进一步的理解分析。
1.Canny边缘检测算子流程:https://blog.csdn.net/zaishuiyifangxym/article/details/90142702
2.边界滞后技术跟踪算法:https://blog.csdn.net/qq_44736333/article/details/109152380
我的工作就是根据两位大佬的blog来进行学习,这两位博主的cv的专栏写的非常好。
如果大家这这篇blog中有什么不明白的可以去他们俩个的专栏里面看看,内容非常全面,应该能够有比较好的解答。
在文章的最后再次表达由衷的感谢!!