ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

kirsch算子解释及python代码实现

2021-10-19 21:33:24  阅读:524  来源: 互联网

标签:kirsch plt python 卷积 算子 np array final 255


Kirsch算子是R.Kirsch提出来一种边缘检测算法,它采用8个模板对图像上
的每一个像素点进行卷积求导数,这8个模板代表8个方向,对图像上的8个特
定边缘方向作出最大响应,运算中取最大值作为图像的边缘输出。
在这里插入图片描述
在这里插入图片描述
Kirsch算子特点
• 在计算边缘强度的同时可以得到边缘的方向
• 各方向间的夹角为45º

import cv2 as cv
import matplotlib.pyplot as plt
import numpy as np
%matplotlib
#kirsch算子
#自定义卷积核,八个方向
m1 = np.array([[5, 5, 5], [-3,0,-3], [-3,-3,-3]])
m2 = np.array([[-3, 5,5], [-3,0,5], [-3,-3,-3]])
m3 = np.array([[-3,-3,5], [-3,0,5], [-3,-3,5]])
m4 = np.array([[-3,-3,-3], [-3,0,5], [-3,5,5]])
m5 = np.array([[-3, -3, -3], [-3,0,-3], [5,5,5]])
m6 = np.array([[-3, -3, -3], [5,0,-3], [5,5,-3]])
m7 = np.array([[5, -3, -3], [5,0,-3], [5,-3,-3]])
m8 = np.array([[5, 5, -3], [5,0,-3], [-3,-3,-3]])

filterlist = [m1, m2, m3, m4, m5, m6, m7, m8]#将各个方向的卷积核放到一起便于统一操作
filtered_list = np.zeros((8, img_clean.shape[0], img_clean.shape[1]))#建立三维数组,第0维表示各个方向卷积后的值

for k in range(8) :
    out = cv.filter2D(img_clean, cv.CV_16S, filterlist[k])#自定义卷积,其实里面的步骤跟Sobel算子是差不多的
    filtered_list[k] = out

final = np.max(filtered_list, axis = 0)#取八个方向中的最大值,也就是取第0维的最大值作为图像该点,滤波之后的新的像素值
final[ np.where(final >= 255)] = 255#令像素值大于255的点等于255
final[ np.where(final < 255) ] = 0#令像素值小于255的点等于0

fig = plt.figure(figsize = (10, 5))#显示图像
fig.set(alpha = 0.2)
plt.subplot2grid((1, 2), (0, 0))
plt.imshow(img_clean, 'gray')

plt.subplot2grid((1, 2), (0, 1))
plt.imshow(final, 'gray')

在这里插入图片描述

标签:kirsch,plt,python,卷积,算子,np,array,final,255
来源: https://blog.csdn.net/weixin_53598445/article/details/120855003

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有