09 Marr算子(LoG算法)
文章目录
- 前言
- 一、高斯拉普拉斯方法
- 二、代码实现
- 1.LoG滤波器
- 2.和图像进行卷积
前言
拉普拉斯检测算子结合在一起进行边缘检测的方法:先对图像进行平滑,然后再用Laplacian算子检测边缘。
因为卷积具有结合律,拉氏变换其实也是对模板的卷积。
一、高斯拉普拉斯方法
h(x,y)的拉氏变换:
所以,就变成了图像跟LoG的卷积,其实可以把LoG当成滤波器。
二、代码实现
1.LoG滤波器
代码如下(示例):
def generate_LoG_filter(size, sigma):# 计算中心位置center = size // 2# 生成网格 meshgrid生成一个二维数组(x,y)x, y = np.meshgrid(np.arange(size), np.arange(size))# 计算每个像素到中心位置的距离的平方r_squared = (x - center) ** 2 + (y - center) ** 2# 生成高斯权值和模板gaussian = 1.0 / (2 * np.pi * sigma ** 2) * np.exp(-r_squared / (2 * sigma ** 2))# 生成拉普拉斯算子模板laplacian = (r_squared - 2 * sigma ** 2) / (sigma ** 4) * gaussian# 将模板归一化laplacian = laplacian/np.sum(laplacian)return laplacian
生成的模板如下:
2.和图像进行卷积
代码如下(示例):
def my_LoG(img, kernel_size, sigma):# 创建LoG滤波器kernel = generate_LoG_filter(kernel_size, sigma)# 图像卷积filtered_img = img_filter2D.my_filter2D(img,kernel)return filtered_img
#边缘判断
# Marr边缘检测
def marr_edge_detection(img, threshold):# 对图像进行LoG滤波filtered_img = my_LoG(img, 5, 1)# 查找零交叉点zero_crossing = np.zeros_like(filtered_img)rows, cols = filtered_img.shapefor i in range(1, rows - 1):for j in range(1, cols - 1):neighbors = [filtered_img[i+1, j], filtered_img[i-1, j], filtered_img[i, j+1], filtered_img[i, j-1],filtered_img[i+1, j+1], filtered_img[i-1, j-1], filtered_img[i+1, j-1], filtered_img[i-1, j+1]]if filtered_img[i, j] == 0:if (np.sign(neighbors) != np.sign(filtered_img[i, j])).any():zero_crossing[i, j] = 255elif (np.sign(neighbors) != np.sign(filtered_img[i, j])).sum() > 2:zero_crossing[i, j] = 255# 将像素值大于阈值的点作为边缘点输出threshold_img = np.zeros_like(filtered_img)threshold_img[filtered_img > threshold] = 255# 将零交叉点和大于阈值的点作为边缘点合并输出edge_img = np.zeros_like(filtered_img)edge_img[(zero_crossing == 255) | (threshold_img == 255)] = 255return edge_img
#打印
# 读取图像并进行Marr边缘检测
img = cv2.imread('lena.bmp', 0)
# 创建一个2x3的子图
fig, axs = plt.subplots(nrows=2, ncols=3, figsize=(10, 8))# 设置不同的阈值参数
thresholds = [10, 30, 50, 70, 90, 110]# 循环绘制每组Marr边缘检测结果
for i, ax in enumerate(axs.flat):if i == 0:# 绘制原图ax.imshow(img, cmap='gray')ax.set_title('Original Image')ax.axis('off')else:# 进行Marr边缘检测并绘制结果edge_img = marr_edge_detection(img, thresholds[i-1])title = f'threshold={thresholds[i-1]}'ax.imshow(edge_img, cmap='gray')ax.set_title(title)ax.axis('off')plt.show()
09 Marr算子(LoG算法)相关推荐
- 【OpenCv】Marr算子边缘检测
Marr算子: Laplacian of a Gaussian(LOG) Marr算子是在Laplacian算子的基础上实现的,它得益于对人的视觉机理的研究,有一定的生物学和生理学意义. 由于Lapl ...
- 如何用matlab求出覆冰图像像素点,输电线路覆冰图像的Canny算子改进算法研究
输电线路覆冰图像的Canny算子改进算法研究 摘 要: 每到冬季 关键词: 形态学滤波; Canny算子; 边缘检测; 覆冰检测; 微分算子 中图分类号:TM755 文献标志码:A文章编号:1006- ...
- 改进边缘检测算子----Marr-Hildreth算法
边缘检测的改进: 一.边缘检测方法是以使用较小的算则为基础的, Marr和Hildreth证明了:(1)灰度变化与图像尺寸无关,因此他们的检测要求使用不同尺寸的算子: (2)灰度的突然变化会在一阶导数 ...
- Opencv2.4学习::边缘检测(6)Marr-Hildreth算法(LOG算法)
边缘检测 1.Sobel 2.Laplace 3.Roberts 4.Canny Marr-Hildreth 简单来说,就是先对图像进行(1)高斯滤波,再进行拉普拉斯变换,(2)由于拉普拉斯变换是二阶 ...
- opencv 基本算子,LOG算子-墨西哥草帽算子,canny算子
本章内容: 1. LOG算子-墨西哥草帽算子 2. canny算子 1. LOG算子-墨西哥草帽算子 输出结果 2. canny算子 输出结果 源代码 #include <ostream> ...
- 【水文模型】09 新安江模型SCE-UA算法自动率定
2022/2/28 实现SCE-UA算法率定新安江模型 下载地址 您可以从Github下载
- 高斯拉普拉斯算子LOG
Laplacian(拉普拉斯)是对于一张图像的二阶空间导数上各向同性的测量.一张图像的Laplacian会显示出intensity(亮度) 剧烈变化的区域,所以经常用作边缘检测. 一幅图像的拉普拉斯变 ...
- LIS 的 n*log 算法 ———二分维护
upper_bound只会替换让留在数组里的最长递增子序列尽可能小 由于upper查出来的结果下标是那个可以插入这个值得最后一个元素 所以他会把大的数变成小的数 upper将可以替换成新元素的元素替换 ...
- 图像边缘检测技术与理论发展脉络梳理大放送
FROM:http://blog.csdn.net/baimafujinji/article/details/23352867 基于梯度的方法 Roberts, Sobel, Prewitt 带方向的 ...
最新文章
- 实探全球第九大超算中心:温水冷却节能30% 正寻求新突破
- oracle record 类型,Oracle记录类型(record)和%rowtype
- permute、transpose、view、reshape、unsequeeze与flatten
- linux 常用命令04 查找和检索
- 读取txt文件赋值到DataGridView中
- exp imp 及参数
- 解决路由环路问题的探讨
- thoughtworks面试题分析与解答
- 树莓派GPIO点亮第一个led
- 【渝粤教育】21秋期末考试土木工程施工10516k1
- 翟菜花:5G时代的顺风车,智能音箱该怎么坐?
- java字符串在字符中的位置_Java如何获取字符在字符串中的位置
- 字符串、bute[]数组和十六进制字符串的相互转换
- 软件系统开发费用的估算——功能点方法 应用实例
- 移动硬盘不能识别的常见7种解决方案 ~ By 逆天经验
- 《大学“电路分析基础”课程实验合集.实验五》丨线性有源二端网络等效电路的研究
- C++ va_list
- 易中天品汉代风云人物09:刘邦崛起之谜
- vue admin template 侧边栏及顶部栏演示字体样式修改
- 三人抢答器-20151105