2024.9.13 Python与图像处理新国大EE5731课程大作业,索贝尔算子计算边缘,高斯核模糊边缘,Haar小波计算边缘
1.编写一个图像二维卷积程序。它应该能够处理任何灰度输入图像,并使用以下内核进行操作:
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
from scipy import linalg
import random as rm
import math
import cv2# import and show the image
img = cv2.imread('einstein.png',cv2.IMREAD_GRAYSCALE)
plt.imshow(img,plt.cm.gray)
print(img)
img_sz=img.shape
代码逻辑:
提取灰度图,显示图片

def pascal(k,n):if k >= 0 and k <= n:y = math.factorial(n)/(math.factorial(n-k)*math.factorial(k))else:y=0return y
算组合种类的pascal函数,就是数学里的大C,之后用于计算索贝尔算子
2.索贝尔算子
Sobel 算子(Sobel Operator) 是一种常用的 边缘检测 算法,用于图像处理领域。它通过计算图像像素的梯度(变化率)来检测图像中的边缘。具体来说,Sobel 算子用于确定图像中灰度变化最明显的区域,这些区域通常对应于物体的边界或细节。
在二维函数中,计算梯度,可以找到变化率最大的部分来,索贝尔算子就是在图像中计算梯度最大的部分。他有两种3*3的卷积核(滤波器)
分别是:

def sobel(order): sobel_x=np.zeros([order,order])smooth=np.zeros([order,1])diff=np.zeros([order,1])for j in range(0,order):smooth=pascal(j,order-1)
# print(smooth)for k in range(0,order):diff=pascal(k,order-2)-pascal(k-1,order-2)
# print(diff)sobel_x[j][k]=smooth*diffsobel_y=-1*sobel_x.Treturn sobel_x,sobel_y
这个代码就可以生成order*order的两种索贝尔算子,如果order是3,那么上面的索贝尔算子就是上面那个图。
# convolution for sobel kernel, 2 kernel in 2 directions
def convolution_2(img,kernel1,kernel2):sz_img=img.shapesz_kernel=kernel1.shape#[a,b]=sz_kernela=int((sz_kernel[0]-1)/2)b=int((sz_kernel[1]-1)/2)pimg=np.zeros(sz_img)for j in range(a,(sz_img[0]-a)):for k in range(b,(sz_img[1]-b)):for i in range(0,2):ximg=np.sum(img[j-a:j+a+1,k-b:k+b+1]*kernel1)yimg=np.sum(img[j-a:j+a+1,k-b:k+b+1]*kernel2)pimg[j][k]=np.abs(ximg)+np.abs(yimg)return pimg
代码逻辑:
举个例子,现在有一个55的图片,你的卷积核是33的,那么现在你需要做的是,在55的图片中先取最左上角的33矩阵和两个卷积核相卷积,然后得出两个数字,给这两个数字都做一次绝对值然后再相加,就是这个点的近似梯度,然后55的图像考虑边缘,能做33次这样的操作,最后得到3*3的矩阵。
理论上求该点的平方和然后开方才应该是这个点的真实梯度,为什么要用绝对值和呢,因为在庞大的计算中,如果都去做平方和,那就太耗费系统资源了,所以使用绝对值和是近似的计算方法,忽略了方向性,只看水平和垂直梯度的绝对强度之和,它可以提供相对较强的边缘信息,但缺少准确性,边缘会显得比较尖锐和不平滑。
# when mask size is 3, ploting the Sobel kenerl processed image
[sobel_x,sobel_y]=sobel(3)
print(sobel_x,'\n',sobel_y)
sobel_img = convolution_2(img,sobel_x,sobel_y)
#sobel_x_img=np.uint8(sobel_x_img)
plt.imshow(sobel_img,plt.cm.gray)
# print(sobel_x_img)
计算卷积,生成边缘图像

3.高斯核与高斯卷积
def convolution_1(img,kernel1):sz_img = img.shape # 获取图像的尺寸sz_kernel = kernel1.shape # 获取卷积核的尺寸a = int((sz_kernel[0]-1)/2) # 计算卷积核在 x 方向的半径b = int((sz_kernel[1]-1)/2) # 计算卷积核在 y 方向的半径pimg = np.zeros(sz_img) # 初始化输出图像的大小,和原图大小相同for j in range(a, (sz_img[0]-a)): # 遍历图像的每一个像素for k in range(b, (sz_img[1]-b)):# 从原图像中提取出一个与高斯核大小相同的子矩阵,进行逐元素相乘并累加ximg = np.sum(img[j-a:j+a+1, k-b:k+b+1] * kernel1)pimg[j][k] = np.abs(ximg) # 将卷积后的结果的绝对值赋值给输出图像return pimg
这个代码是卷积的定义操作,高斯核还没进去
#kernel
#gaussian
def gaussian(x,y,delta):return 1/(2*math.pi*delta**2)*np.exp(-1*(x*x+y*y)/(2*delta**2))
def Gau(order):delta=0.3*((order-1)/2-1)+0.8a=int((order-1)/2)ga=np.zeros([order,order])for j in range(-a,a+1):for k in range(-a,a+1):ga[j][k]=gaussian(j,k,delta)return ga
# ga1=1/16*np.array([[1,2,1],[2,4,2],[1,2,1]])
# ga2=1/159*np.array([[2,4,5,4,2],[4,9,12,9,4],[5,12,15,12,5],[4,9,12,9,4],[2,4,5,4,2]])
高斯核(Gaussian Kernel)是图像处理中一种常用的滤波器,用于平滑图像,消除噪声。它是根据高斯函数定义的二维矩阵。高斯核的作用是将图像中的每个像素与其邻域像素的加权平均计算,权重依据高斯分布确定,离中心越近的像素权重越大,离得越远的像素权重越小。
卷积后的图像会变得更加平滑,噪声被抑制,同时保留主要的图像特征。这个函数中使用了 绝对值,通常用于保持结果的非负性,但在一般高斯卷积中不一定需要绝对值。
代码先定义了高斯函数,然后定义了高斯核。并给出了常见的三阶高斯核和五阶高斯核
ga1 是较小的高斯核,平滑效果相对较弱,但保留了更多的图像细节。
ga2 是较大的高斯核,平滑效果较强,适合噪声较大的图像。
# when mask size is 3, ploting the Gaussian kenerl processed image
ga1=Gau(3)
print(ga1)
gaussian_img = convolution_1(img,ga1)
#sobel_x_img=np.uint8(sobel_x_img)
plt.imshow(gaussian_img,plt.cm.gray)
#print(sobel_x_img)
这个代码就是对图像进行高斯卷积操作模糊边缘,高斯卷积核为三层高斯核

效果如下,如果用九阶高斯核代码和输出如下:
# when mask size is 9, ploting the Gaussian kenerl processed image
ga2=Gau(9)
print(ga2)
gaussian_img = convolution_1(img,ga2)
#sobel_x_img=np.uint8(sobel_x_img)
plt.imshow(gaussian_img,plt.cm.gray)
#print(sobel_x_img)

4.Haar小波卷积核
Haar 小波卷积 是一种高效的边缘检测和特征提取方法。它通过简单的 1 和 -1 构造出卷积核,可以快速检测图像中的边缘和变化。
卷积操作 将 Haar 核应用于图像,生成新的特征图,用于分析图像的结构和特征。
Haar 小波广泛应用于 边缘检测、图像压缩 和 特征提取 等任务,尤其适合实时计算和高效处理场景。
在计算机视觉中,Haar 小波常用于特征提取。例如,人脸检测算法中,Haar 特征被用于快速检测图像中的人脸区域。适合实时计算和高效处理场景。
与 Sobel 核的对比
Sobel 卷积核也是用于边缘检测的,但与 Haar 核不同,Sobel 核使用的是平滑的梯度变化,而 Haar 核直接检测的是 1 和 -1 的急剧变化。与 Sobel 核相比,Haar 核的计算更加简单,但 Sobel 核能够更精细地检测梯度信息,适合检测较为平滑的边缘。
# Haar kernel
def Haar(order):block=np.ones([order,order]).astype(int)mask1=np.concatenate([-1*block,block],axis=0)mask2=np.concatenate([-1*block,block],axis=1)mask3=np.concatenate([block,-1*block,block],axis=0)mask4=np.concatenate([block,-1*block,block],axis=1)mask5=np.concatenate([mask1,-1*mask1],axis=1)mask=[mask1,mask2,mask3,mask4,mask5]return mask# 2D convolution for Haar kernel
def convolution_3(img,mask):sz_img=img.shapesz_kernel=mask.shape#[a,b]=sz_kernela=int(sz_kernel[0])b=int(sz_kernel[1])pimg=np.zeros(sz_img)for j in range(0,(sz_img[0]-a)):for k in range(0,(sz_img[1]-b)):for i in range(0,2):ximg=np.sum(img[j:j+a,k:k+b]*mask)#yimg=np.sum(img[j-a:j+a+1,k-b:k+b+1]*kernel2)pimg[j][k]=np.abs(ximg)return pimg
代码逻辑:
定义Haar卷积核,注意,给定一个维度数,会同时产生五个Haar卷积核,存放在数组中
mask1: 检测 水平边缘,例如物体的上下轮廓。
mask2: 检测 垂直边缘,例如物体的左右轮廓。
mask3: 检测 正对角线方向,捕捉从左上到右下的边缘。
mask4: 检测 反对角线方向,捕捉从左下到右上的边缘。
mask5: 检测 复杂变化,这是由 mask1 的进一步组合生成的更复杂卷积核,通过在水平和垂直方向进行进一步拼接。这种结构的卷积核可以检测图像中的 更复杂的变化模式,包括一些图像块内部的细节变化。它的作用不是单一的某个方向检测,而是组合式的模式检测,能捕捉图像中的更细腻特征。
# when mask size is 1, ploting the Haar kenerl processed image
mask=Haar(1)
print(mask)
for ma in mask:Haar_img = convolution_3(img,ma)plt.imshow(Haar_img,plt.cm.gray)plt.show()# when mask size is 2, ploting the Haar kenerl processed image
mask=Haar(2)
print(mask)
for ma in mask:Haar_img = convolution_3(img,ma)plt.imshow(Haar_img,plt.cm.gray)plt.show()
这个代码就是使用Haar的两个不同的size输出的效果。
结果就是Sobel 核提取图像的边缘;高斯核使图像模糊;不同的 Haar mask 效果不同。Type1 的输出像 sobel 一样提取边缘。Type2 的输出像高斯一样使图像模糊。Type3 看起来像是 type1 中 2 个输出的组合。
核的尺寸越大,核的效果越强。
相关文章:
2024.9.13 Python与图像处理新国大EE5731课程大作业,索贝尔算子计算边缘,高斯核模糊边缘,Haar小波计算边缘
1.编写一个图像二维卷积程序。它应该能够处理任何灰度输入图像,并使用以下内核进行操作: %matplotlib inline import numpy as np import matplotlib.pyplot as plt from scipy import linalg import random as rm import math import cv2# import and …...
动态IP池的IP都是纯净IP吗?
在当今互联网时代,动态IP池作为一种网络资源管理策略,被广泛应用于数据抓取、市场调研、广告验证等多种场景中。动态IP池能够提供大量可轮换的IP地址,以帮助用户避免因频繁访问同一网站而被封禁IP的情况。然而,一个关键的问题是&a…...
【MySQL】查询表中重复数据、模糊查询列信息、快速copy表数据(1)
一、SQL查询重复的数据: 1、SQL格式: Select * From 数据表 Where 重复记录字段 in ( select 重复记录字段 From 数据表 Group By 重复记录字段 Having Count(重复记录字段)>1) 2、举例: 在这个patient_member_info表中,我们…...
计算机操作系统之并行性与并发性笔记
目录 在计算机操作系统中,并行性与并发性是两个既相似又有区别的重要概念 并行性: 并发性: 可以通过多任务处理和资源共享来具体说明 并发性的例子 并行性的例子 总结 在计算机操作系统中,并行性与并发性是两个既相似又有区别…...
顶级高效的ChatGPT论文润色提示词和使用技巧
在学术研究中,精确和高效地对文本进行润色和修改是一个必不可少的重要环节。随着学术论文篇幅的增长和内容的复杂度上升,找到一种能够有效整理和优化修改内容的方法变得尤为关键。本文将探讨如何利用ChatGPT作为工具,通过具体的指令和策略,来优化文本的修改过程,提高学术写…...
WebAPI (一)DOM树、DOM对象,操作元素样式(style className,classList)。表单元素属性。自定义属性。间歇函数定时器
文章目录 Web API基本认知一、 变量声明二、 DOM1. DOM 树2. DOM对象3. 获取DOM对象(1)、选择匹配的第一个元素(2)、选择匹配多个元素 三、 操作元素1. 操作元素内容2. 操作元素属性(1)、常用属性(href之类的)(2)、通过style属性操作CSS(3)、通过类名(cl…...
若依框架开发
若依环境 介绍 若依是一款快速开发平台(低代码),用于快速构建企业级后台管理系统,它提供了许多常用的功能模块和组件,包括权限管理、代码生成、工作流、消息中心等 官方地址: https://www.ruoyi.vip/ 基于Spring Boot和Spring Cloud…...
局域网windows下使用Git
windows下如何使用局域网进行git部署 准备工作第一步 ,ip设置设置远程电脑的ip设置,如果不会设置请点击[这里](https://blog.csdn.net/Black_Friend/article/details/142170705?spm1001.2014.3001.5501)设置本地电脑的ip:验证 第二步&#x…...
Redis访问工具
使用Redis存储缓存数据,如何通过Java去访问Redis? 防止后面看晕,先来张图。 1. Redis的客户端库 Redis的客户端库是Redis官方提供的,用于让Java等编程语言与Redis服务器进行通信的工具包。常见的Redis客户端库有多个,…...
vue3+ant design vue动态实现级联菜单~
1、这里使用的是ant design vue 的TreeSelect 树选择来实现的。 <a-form-item name"staffDept" label"责任部门" labelAlign"left"><a-tree-selectv-model:value"formState.staffDept"show-search//允许在下拉框中添加搜索框…...
软件可维护性因素例题
答案:C 知识点: 系统可维护性因素决定 可理解性 可测试性 可修改性 选项C可移植性错误...
git的一些操作
参考视频: git分支详解(约10分钟掌握分支80%操作),git-branch,git分支管理,git分支操作,git分支基础和操作,2023年git基础使用教程 不同的分支相当于不同的平行世界 合并分支 两个分支是我们项…...
opencv实战项目二十三:基于BEBLID描述符的特征点匹配实现表盘校正
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、特征点匹配介绍二、特征点检测三、特征描述符计算四,描述符的匹配筛选五,根据匹配结果映射图片六,整体代码:…...
数据库是全表扫描是怎么扫描法?
全表扫描是数据库服务器用来搜寻表的每一条记录的过程,直到所有符合给定条件的记录返回为止。 在执行全表扫描时,数据库会逐行扫描表中的所有记录,以找到符合查询条件的记录。这种扫描方式适用于没有为查询条件中的字段建立索引的情况。全…...
认准这10款人力资源系统,90%的企业都在用!
本文将为大家推荐十款主流的人力资源系统,为企业选型提供参考! 想象一下,企业在不断发展壮大的过程中,员工数量逐渐增多,人事管理变得越来越复杂。如果没有一个高效的人力资源系统,就如同在大海中航行却没有…...
2024年我的利基出版转型——新战略与重点解析
这篇文章酝酿已久。这是我在网络出版策略上投入数百小时后得出的成果。 像我们这个行业的许多人一样,即网络出版行业,我一直忙于彻底改造整个出版业务。 这是一段漫长的旅程,这是肯定的。 我预感在此过程中还会有更多调整,但我…...
【数据结构】双向链表专题
目录 1.双向链表的结构 2.双向链表的实现 2.1初始化 以参数的形式初始化链表: 以返回值的形式初始化链表: 2.2尾插 2.3打印 2.4头插 2.5尾删 2.6头删 2.7查找 2.8在指定位置之后插入数据编辑 2.9删除pos节点 2.10销毁 3.整理代码 3.1…...
大二上学期计划安排
大二上学期计划安排 学期目标: 加强算法学习,提升算法思维,为以后的算法竞赛做准备学习java知识,学习框架,构建知识体系,深入底层,增强理解增加项目经验,独立完成至少一个项目,并进行交流,优化增强团队凝聚力,营造良好的团队氛围阅读书籍,阅读至少3本以上经典书籍 日常学习安…...
HarmonyOS开发实战( Beta5.0)图片编辑实现马赛克效果详解
鸿蒙HarmonyOS开发往期必看: HarmonyOS NEXT应用开发性能实践总结 最新版!“非常详细的” 鸿蒙HarmonyOS Next应用开发学习路线!(从零基础入门到精通) 介绍 本示例将原图手指划过的区域分割成若干个大小一致的小方格…...
【新书介绍】《JavaScript前端开发与实例教程(微课视频版)(第2版)》
本书重点 无任何基础的初学者,高校JavaScript课程教材。 配套非常全,提供案例源代码、PPT课件、课后习题答案、微课视频、教案、教学大纲、课程实训、期末考试试卷、章节测试、实验报告、学习通建课资源包。 内容简介 JavaScript是开发Web前端必须掌…...
Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...
【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论
路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中(图1): mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...
破解路内监管盲区:免布线低位视频桩重塑停车管理新标准
城市路内停车管理常因行道树遮挡、高位设备盲区等问题,导致车牌识别率低、逃费率高,传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法,正成为破局关键。该设备安装于车位侧方0.5-0.7米高度,直接规避树枝遮…...
