2024.9.13 Python与图像处理新国大EE5731课程大作业,索贝尔算子计算边缘,高斯核模糊边缘,Haar小波计算边缘

news2024/11/19 9:38:50

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=0
    return 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*diff
            
    sobel_y=-1*sobel_x.T
    return 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.shape
    sz_kernel=kernel1.shape
    #[a,b]=sz_kernel
    
    a=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.8
    a=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.shape
    sz_kernel=mask.shape
    #[a,b]=sz_kernel
    
    a=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 个输出的组合。
核的尺寸越大,核的效果越强。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2132708.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于云端的SIEM解决方案

最近的一项市场研究爆出了一组惊人的数字&#xff0c;在2024年&#xff0c;网络攻击增加了600%&#xff01;更加令人担忧的是&#xff0c;这恐怕只是冰山一角。世界各地的组织都已经认识到了这一威胁&#xff0c;并正在采取多重措施来抵御来自线下和远程混合式办公模式带来的网…

SpringBoot项目获取统一前缀配置以及获取非确定名称配置

SpringBoot项目获取统一前缀配置以及获取非确定名称配置 在SpringBoot项目中&#xff0c;我们经常看到统一前缀的配置&#xff0c;我们该怎么统一获取 my.config.a.namexiaoming my.config.a.age18 my.config.a.addressguangdong my.config.b.namexiaomli my.config.b.age20 my…

【Unity】手写图片轮播

最近项目空闲&#xff0c;回顾了一下之前写的杂七杂八的软件&#xff0c;比较多&#xff0c;而且比较杂乱&#xff0c;代码能看明白&#xff0c;但是非常不科学&#xff0c;不符合逻辑&#xff0c;然后我就有点无奈&#xff0c;虽说是做了很多年的老程序的&#xff0c;但是遇到…

小目标检测顶会新思路!最新成果刷爆遥感SOTA,参数小了18倍

遥感领域的小目标检测一直是个具有挑战性和趣味性的研究方向&#xff0c;同时也是顶会顶刊的常客。但不得不说&#xff0c;今年关于遥感小目标检测的研究热情尤其高涨&#xff0c;已经出现了很多非常优秀的成果。 比如SuperYOLO方法&#xff0c;通过融合多模态数据并执行高分辨…

数据库安全性控制

‍ 在当今信息化时代&#xff0c;数据库安全性 对于保护数据免受非法访问和损害至关重要。无论是个人数据还是企业机密&#xff0c;数据库安全性控制都能有效地防范潜在的威胁。本文将为你深入浅出地介绍数据库安全性控制的关键方法和机制&#xff0c;帮助你轻松掌握这一重要概…

vulnhub靶机:21 LTR: Scene1

下载 下载地址&#xff1a;https://www.vulnhub.com/entry/21ltr-scene-1,3/ 导入靶机 一直按默认的来&#xff0c;一直下一步 修改网卡 修改靶机和 kali 攻击机网络模式为仅主机模式 把仅主机模式的 IP 修改为 192.168.2.0 信息收集 主机发现 arp-scan -l 靶机 IP 是 192.…

Windows系统下安装Redis

文章目录 1、下载Redis安装包2、解压压缩包3、运行Redis4、Redis连接检测5、Redis相关设置5.1设置环境变量PATH5.2Redis 配置文件修改 1、下载Redis安装包 Windows版本的Redis可以在Github中下载&#xff1a;下载Redis 2、解压压缩包 将下载的压缩包解压到某个目录下&#…

微服务CI/CD实践(五)Jenkins Docker 自动化构建部署Java微服务

微服务CI/CD实践系列&#xff1a; 微服务CI/CD实践&#xff08;一&#xff09;环境准备及虚拟机创建 微服务CI/CD实践&#xff08;二&#xff09;服务器先决准备 微服务CI/CD实践&#xff08;三&#xff09;Jenkins部署及环境配置 微服务CI/CD实践&#xff08;四&#xff09;…

c++20 std::format 格式化说明

在标头<format>定义 ()功能很强大&#xff0c;它把字符串当成一个模板&#xff0c;通过传入的参数进行格式化&#xff0c;并且使用大括号‘{}’作为特殊字符代替‘%’。 1、基本用法 &#xff08;1&#xff09;不带编号&#xff0c;即“{}”&#xff08;2&#xff09;带…

学会使用西门子博途Startdrive中的测量功能

工程师在驱动调试过程中&#xff0c;往往需要对驱动系统的性能进行分析及优化&#xff0c;比如说借助于调试软件中的驱动器测量功能&#xff0c;可以得到驱动系统的阶跃响应、波特图等&#xff0c;以此为依据工程师可以调整速度控制器、电流控制器的相关参数&#xff0c;使驱动…

今天一定要彻底卸载Windows Denfender!攻略给你了

最近有小伙伴吐槽&#xff1a;明明都已经把Windows Defender关了&#xff0c;为啥它还会时不时拦截我下载的文件&#xff1f; 小白就问&#xff1a;明明是谁&#xff1f; 嗯…… 肯定有小伙伴遇到同样的问题&#xff0c;Windows Defender已经关了&#xff0c;但好像并没有完…

利用Xinstall,轻松搭建高效App运营体系

在移动互联网时代&#xff0c;App的推广和运营成为了企业发展的关键环节。然而&#xff0c;随着流量红利的逐渐消失&#xff0c;传统的推广方式已经难以满足企业快速获客的需求。在这个背景下&#xff0c;Xinstall作为一款强大的渠道推广工具&#xff0c;凭借其独特的功能和优势…

【IP协议】IP协议报头结构(上)

IP 协议报头结构 4位版本 实际上只有两个取值 4 > IPv4&#xff08;主流&#xff09;6 > IPv6 IPv2&#xff0c;IPv5 在实际中是没有的&#xff0c;可能是理论上/实验室中存在 4位首部长度 IP 协议报头也是变长的&#xff0c;因为选项个数不确定&#xff0c;所以报头长…

【达梦数据库】mysql 和达梦 tinyint 与 bit 返回值类型差异

测试环境 mysql5.7.44 达梦2024Q2季度版 前言 在mysql 中存在 tinyint&#xff08;1&#xff09;的用法来实现存储0 1 作为boolean的标识列&#xff1b;但是在达梦并不允许使用 tinyint&#xff08;1&#xff09;来定义列&#xff0c;只能使用 tinyint 即 取值范围为&#xff…

《深度学习》CUDA安装配置、pytorch库、torchvision库、torchaudio库安装

目录 一、下载CUDA 1、什么是CUDA 2、查看电脑支持版本号 3、下载CUDA包 1&#xff09;进入下列下载位置 2&#xff09;选择版本 4、安装CUDA 1&#xff09;双击这个文件&#xff0c;然后得到下列图像 2&#xff09;选择自定义安装 3&#xff09;取消选项Visual Inte…

众店绿色积分模式:引领消费新风尚,共筑商业新生态

大家好&#xff0c;我是吴军&#xff0c;目前担任一家业界知名的软件开发公司产品管理的领航者。 最近&#xff0c;市场上涌动着一股创新商业模式的新浪潮&#xff0c;它不仅为消费者编织了一张省钱的网&#xff0c;更为商家铺设了一条吸引新客与增收的道路&#xff0c;甚至平…

【智能流体力学】数值模拟中的稳态和瞬态

在流体力学和数值模拟中, 稳态 (Steady State)意味着流体的物理量(如速度、压力、温度等)不随时间变化。换句话说,在稳态模拟中,系统已经达到了平衡,任何位置上的流场特性都不再随时间发生变化。 其他教程参考:https://doc.cfd.direct/openfoam/user-guide-v12/index…

Linux环境变量详解命令行参数

&#x1f31f;目录 &#x1f4dd;1. 什么是环境变量&#xff1f;&#x1f4dd;2. 查看系统的环境变量&#x1f4dd;3. 添加环境变量&#x1f4dd;4. 环境变量用例5. 命令行参数 好雨知时节 当春乃发生 随风潜入夜 润物细无声 &#x1f4dd;1. 什么是环境变量&#xff1f; 环境…

Matlab simulink建模与仿真 第十二章(信号属性库)

参考视频&#xff1a;simulink1.1simulink简介_哔哩哔哩_bilibili 一、信号属性库中的模块概览 1、信号属性操作库 注&#xff1a;数据类型转换模块在第二章中有介绍&#xff0c;本章不再赘述&#xff1b;数据类型传播实例在本章也不进行介绍。 2、信号属性检测库 二、数据类…

OPENAI的 o1非常强-可是也被网友们玩坏了

OpenAI o1的潜力 OpenAI o1作为当前人工智能领域的先锋&#xff0c;展现了强大的推理能力和文本生成水平。其在多个标准测试中表现优异&#xff0c;甚至在某些任务上超越了人类PhD水平。这让人们对其能力充满期待。根据数据&#xff0c;o1在处理复杂语句和逻辑推理解题时&…