当前位置: 首页 > news >正文

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的卷积核(滤波器)
分别是:
两种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.编写一个图像二维卷积程序。它应该能够处理任何灰度输入图像&#xff0c;并使用以下内核进行操作&#xff1a; %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吗?

在当今互联网时代&#xff0c;动态IP池作为一种网络资源管理策略&#xff0c;被广泛应用于数据抓取、市场调研、广告验证等多种场景中。动态IP池能够提供大量可轮换的IP地址&#xff0c;以帮助用户避免因频繁访问同一网站而被封禁IP的情况。然而&#xff0c;一个关键的问题是&a…...

【MySQL】查询表中重复数据、模糊查询列信息、快速copy表数据(1)

一、SQL查询重复的数据&#xff1a; 1、SQL格式&#xff1a; Select * From 数据表 Where 重复记录字段 in ( select 重复记录字段 From 数据表 Group By 重复记录字段 Having Count(重复记录字段)>1) 2、举例&#xff1a; 在这个patient_member_info表中&#xff0c;我们…...

计算机操作系统之并行性与并发性笔记

目录 在计算机操作系统中&#xff0c;并行性与并发性是两个既相似又有区别的重要概念 并行性&#xff1a; 并发性&#xff1a; 可以通过多任务处理和资源共享来具体说明 并发性的例子 并行性的例子 总结 在计算机操作系统中&#xff0c;并行性与并发性是两个既相似又有区别…...

顶级高效的ChatGPT论文润色提示词和使用技巧

在学术研究中,精确和高效地对文本进行润色和修改是一个必不可少的重要环节。随着学术论文篇幅的增长和内容的复杂度上升,找到一种能够有效整理和优化修改内容的方法变得尤为关键。本文将探讨如何利用ChatGPT作为工具,通过具体的指令和策略,来优化文本的修改过程,提高学术写…...

WebAPI (一)DOM树、DOM对象,操作元素样式(style className,classList)。表单元素属性。自定义属性。间歇函数定时器

文章目录 Web API基本认知一、 变量声明二、 DOM1. DOM 树2. DOM对象3. 获取DOM对象(1)、选择匹配的第一个元素(2)、选择匹配多个元素 三、 操作元素1. 操作元素内容2. 操作元素属性(1)、常用属性&#xff08;href之类的&#xff09;(2)、通过style属性操作CSS(3)、通过类名(cl…...

若依框架开发

若依环境 介绍 ‌若依是一款快速开发平台(低代码)&#xff0c;用于快速构建企业级后台管理系统&#xff0c;它提供了许多常用的功能模块和组件&#xff0c;包括权限管理、代码生成、工作流、消息中心等 官方地址: https://www.ruoyi.vip/ ‌基于Spring Boot和Spring Cloud‌…...

局域网windows下使用Git

windows下如何使用局域网进行git部署 准备工作第一步 &#xff0c;ip设置设置远程电脑的ip设置&#xff0c;如果不会设置请点击[这里](https://blog.csdn.net/Black_Friend/article/details/142170705?spm1001.2014.3001.5501)设置本地电脑的ip&#xff1a;验证 第二步&#x…...

Redis访问工具

使用Redis存储缓存数据&#xff0c;如何通过Java去访问Redis&#xff1f; 防止后面看晕&#xff0c;先来张图。 1. Redis的客户端库 Redis的客户端库是Redis官方提供的&#xff0c;用于让Java等编程语言与Redis服务器进行通信的工具包。常见的Redis客户端库有多个&#xff0c…...

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//允许在下拉框中添加搜索框…...

软件可维护性因素例题

答案&#xff1a;C 知识点&#xff1a; 系统可维护性因素决定 可理解性 可测试性 可修改性 选项C可移植性错误...

git的一些操作

参考视频: git分支详解&#xff08;约10分钟掌握分支80%操作&#xff09;&#xff0c;git-branch&#xff0c;git分支管理&#xff0c;git分支操作&#xff0c;git分支基础和操作&#xff0c;2023年git基础使用教程 不同的分支相当于不同的平行世界 合并分支 两个分支是我们项…...

opencv实战项目二十三:基于BEBLID描述符的特征点匹配实现表盘校正

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、特征点匹配介绍二、特征点检测三、特征描述符计算四&#xff0c;描述符的匹配筛选五&#xff0c;根据匹配结果映射图片六&#xff0c;整体代码&#xff1a;…...

数据库是全表扫描是怎么扫描法?

全表扫描是数据库服务器用来搜寻表的每一条记录的过程&#xff0c;直到所有符合给定条件的记录返回为止。‌ 在执行全表扫描时&#xff0c;数据库会逐行扫描表中的所有记录&#xff0c;以找到符合查询条件的记录。这种扫描方式适用于没有为查询条件中的字段建立索引的情况。全…...

认准这10款人力资源系统,90%的企业都在用!

本文将为大家推荐十款主流的人力资源系统&#xff0c;为企业选型提供参考&#xff01; 想象一下&#xff0c;企业在不断发展壮大的过程中&#xff0c;员工数量逐渐增多&#xff0c;人事管理变得越来越复杂。如果没有一个高效的人力资源系统&#xff0c;就如同在大海中航行却没有…...

2024年我的利基出版转型——新战略与重点解析

这篇文章酝酿已久。这是我在网络出版策略上投入数百小时后得出的成果。 像我们这个行业的许多人一样&#xff0c;即网络出版行业&#xff0c;我一直忙于彻底改造整个出版业务。 这是一段漫长的旅程&#xff0c;这是肯定的。 我预感在此过程中还会有更多调整&#xff0c;但我…...

【数据结构】双向链表专题

目录 1.双向链表的结构 2.双向链表的实现 2.1初始化 以参数的形式初始化链表&#xff1a; 以返回值的形式初始化链表&#xff1a; 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开发往期必看&#xff1a; HarmonyOS NEXT应用开发性能实践总结 最新版&#xff01;“非常详细的” 鸿蒙HarmonyOS Next应用开发学习路线&#xff01;&#xff08;从零基础入门到精通&#xff09; 介绍 本示例将原图手指划过的区域分割成若干个大小一致的小方格…...

【新书介绍】《JavaScript前端开发与实例教程(微课视频版)(第2版)》

本书重点 无任何基础的初学者&#xff0c;高校JavaScript课程教材。 配套非常全&#xff0c;提供案例源代码、PPT课件、课后习题答案、微课视频、教案、教学大纲、课程实训、期末考试试卷、章节测试、实验报告、学习通建课资源包。 内容简介 JavaScript是开发Web前端必须掌…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...

C++使用 new 来创建动态数组

问题&#xff1a; 不能使用变量定义数组大小 原因&#xff1a; 这是因为数组在内存中是连续存储的&#xff0c;编译器需要在编译阶段就确定数组的大小&#xff0c;以便正确地分配内存空间。如果允许使用变量来定义数组的大小&#xff0c;那么编译器就无法在编译时确定数组的大…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...

基于Java+VUE+MariaDB实现(Web)仿小米商城

仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意&#xff1a;运行前…...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧

上周三&#xff0c;HubSpot宣布已构建与ChatGPT的深度集成&#xff0c;这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋&#xff0c;但同时也存在一些关于数据安全的担忧。 许多网络声音声称&#xff0c;这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...

在 Spring Boot 项目里,MYSQL中json类型字段使用

前言&#xff1a; 因为程序特殊需求导致&#xff0c;需要mysql数据库存储json类型数据&#xff0c;因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...

ThreadLocal 源码

ThreadLocal 源码 此类提供线程局部变量。这些变量不同于它们的普通对应物&#xff0c;因为每个访问一个线程局部变量的线程&#xff08;通过其 get 或 set 方法&#xff09;都有自己独立初始化的变量副本。ThreadLocal 实例通常是类中的私有静态字段&#xff0c;这些类希望将…...