【计算机视觉】卷积、均值滤波、高斯滤波、Sobel算子、Prewitt算子(Python实现)

article/2025/11/9 3:45:38

##1.环境的搭建

  • Python 3.6
  • OpenCV

Open Source Computer Vision Library.OpenCV于1999年由Intel建立,如今由Willow Garage提供支持。OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、MacOS操作系统上。它轻量级而且高效——由一系列 C 函数和少量C++类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。最新版本是3.1 ,2016年1月29日发布。

OpenCV 安装命令

pip install opencv-python

觉得有用就点颗星吧
######代码:https://github.com/luojie1024/Computer-vision-Classwork


##2.卷积的实现

卷积的概念自行百度吧

# 卷积
def imgConvolve(image, kernel):''':param image: 图片矩阵:param kernel: 滤波窗口:return:卷积后的矩阵'''img_h = int(image.shape[0])img_w = int(image.shape[1])kernel_h = int(kernel.shape[0])kernel_w = int(kernel.shape[1])# paddingpadding_h = int((kernel_h - 1) / 2)padding_w = int((kernel_w - 1) / 2)convolve_h = int(img_h + 2 * padding_h)convolve_W = int(img_w + 2 * padding_w)# 分配空间img_padding = np.zeros((convolve_h, convolve_W))# 中心填充图片img_padding[padding_h:padding_h + img_h, padding_w:padding_w + img_w] = image[:, :]# 卷积结果image_convolve = np.zeros(image.shape)# 卷积for i in range(padding_h, padding_h + img_h):for j in range(padding_w, padding_w + img_w):image_convolve[i - padding_h][j - padding_w] = int(np.sum(img_padding[i - padding_h:i + padding_h+1, j - padding_w:j + padding_w+1]*kernel))return image_convolve

##3.均值滤波的实现

均值滤波实际上也就是卷积和的平均,卷积和/滤波大小

原图

这里写图片描述

# 均值滤波
def imgAverageFilter(image, kernel):''':param image: 图片矩阵:param kernel: 滤波窗口:return:均值滤波后的矩阵'''return imgConvolve(image, kernel) * (1.0 / kernel.size)
3x3均值滤波效果图

这里写图片描述

5x5均值滤波效果图

这里写图片描述

参考:https://www.cnblogs.com/wangguchangqing/p/6399293.html

##4.高斯滤波的实现

  • 1.根据σ获得高斯滤波器的模板
  • 2.然后使用该模板对图像进行卷积

σ是标准差。要想得到一个高斯滤波器的模板,可以对高斯函数进行离散化,得到的高斯函数值作为模板的系数。

原图

这里写图片描述

# 高斯滤波
def imgGaussian(sigma):''':param sigma: σ标准差:return: 高斯滤波器的模板'''img_h = img_w = 2 * sigma + 1gaussian_mat = np.zeros((img_h, img_w))for x in range(-sigma, sigma + 1):for y in range(-sigma, sigma + 1):gaussian_mat[x + sigma][y + sigma] = np.exp(-0.5 * (x ** 2 + y ** 2) / (sigma ** 2))return gaussian_mat
sigma=1 效果图

这里写图片描述

sigma=2 效果图

这里写图片描述

sigma=3 效果图

这里写图片描述

参考:https://www.cnblogs.com/wangguchangqing/p/6407717.html

##5. Sobel算子的实现

原图

原图

使用Sobel算子作为模板,用来对图像进行边缘检测,水平 竖直边缘

# sobel
sobel_1 = np.array([[-1, 0, 1],[-2, 0, 2],[-1, 0, 1]])sobel_2 = np.array([[-1, -2, -1],[0, 0, 0],[1, 2, 1]])

其中sobel_1是对竖直方向的边缘检查,sobel_2是对水平方向的边缘检测

# Sobel Edge
def sobelEdge(image, sobel):''':param image: 图片矩阵:param sobel: 滤波窗口:return: Sobel处理后的矩阵'''return imgConvolve(image, sobel)
sobel_1 效果图

这里写图片描述

sobel_2 效果图

这里写图片描述
参考:https://www.cnblogs.com/freeblues/p/5738987.html

##6. Prewitt算子的实现

使用分别使用Prewitt1算子、Prewitt2算子作为模板,用来对图像进行边缘检测,水平+竖直边缘

# prewitt 算子
prewitt_1 = np.array([[-1, 0, 1],[-1, 0, 1],[-1, 0, 1]])prewitt_2 = np.array([[-1, -1, -1],[0, 0, 0],[1, 1, 1]])
# Prewitt Edge
def prewittEdge(image, prewitt_x, prewitt_y):''':param image: 图片矩阵:param prewitt_x: 竖直方向:param prewitt_y:  水平方向:return:处理后的矩阵'''img_X = imgConvolve(image, prewitt_x)img_Y = imgConvolve(image, prewitt_y)img_prediction = np.zeros(img_X.shape)for i in range(img_prediction.shape[0]):for j in range(img_prediction.shape[1]):img_prediction[i][j] = max(img_X[i][j], img_Y[i][j])return img_prediction
Prewitt效果图

这里写图片描述

参考:https://baike.baidu.com/item/Prewitt%E7%AE%97%E5%AD%90/8415245?fr=aladdin


7.完整代码(图片+代码请看github)

# -*- coding: utf-8 -*-
import cv2
import numpy as np
import math'''
# @Time    : 18-3-31 下午2:16
# @Author  : 罗杰                  
# @ID      : F1710w0249
# @File    : assignments.py
# @Desc    : 计算机视觉作业01
'''# 卷积
def imgConvolve(image, kernel):''':param image: 图片矩阵:param kernel: 滤波窗口:return:卷积后的矩阵'''img_h = int(image.shape[0])img_w = int(image.shape[1])kernel_h = int(kernel.shape[0])kernel_w = int(kernel.shape[1])# paddingpadding_h = int((kernel_h - 1) / 2)padding_w = int((kernel_w - 1) / 2)convolve_h = int(img_h + 2 * padding_h)convolve_W = int(img_w + 2 * padding_w)# 分配空间img_padding = np.zeros((convolve_h, convolve_W))# 中心填充图片img_padding[padding_h:padding_h + img_h, padding_w:padding_w + img_w] = image[:, :]# 卷积结果image_convolve = np.zeros(image.shape)# 卷积for i in range(padding_h, padding_h + img_h):for j in range(padding_w, padding_w + img_w):image_convolve[i - padding_h][j - padding_w] = int(np.sum(img_padding[i - padding_h:i + padding_h + 1, j - padding_w:j + padding_w + 1] * kernel))return image_convolve# 均值滤波
def imgAverageFilter(image, kernel):''':param image: 图片矩阵:param kernel: 滤波窗口:return:均值滤波后的矩阵'''return imgConvolve(image, kernel) * (1.0 / kernel.size)# 高斯滤波
def imgGaussian(sigma):''':param sigma: σ标准差:return: 高斯滤波器的模板'''img_h = img_w = 2 * sigma + 1gaussian_mat = np.zeros((img_h, img_w))for x in range(-sigma, sigma + 1):for y in range(-sigma, sigma + 1):gaussian_mat[x + sigma][y + sigma] = np.exp(-0.5 * (x ** 2 + y ** 2) / (sigma ** 2))return gaussian_mat# Sobel Edge
def sobelEdge(image, sobel):''':param image: 图片矩阵:param sobel: 滤波窗口:return:Sobel处理后的矩阵'''return imgConvolve(image, sobel)# Prewitt Edge
def prewittEdge(image, prewitt_x, prewitt_y):''':param image: 图片矩阵:param prewitt_x: 竖直方向:param prewitt_y:  水平方向:return:处理后的矩阵'''img_X = imgConvolve(image, prewitt_x)img_Y = imgConvolve(image, prewitt_y)img_prediction = np.zeros(img_X.shape)for i in range(img_prediction.shape[0]):for j in range(img_prediction.shape[1]):img_prediction[i][j] = max(img_X[i][j], img_Y[i][j])return img_prediction######################常量################################
# 滤波3x3
kernel_3x3 = np.ones((3, 3))
# 滤波5x5
kernel_5x5 = np.ones((5, 5))# sobel 算子
sobel_1 = np.array([[-1, 0, 1],[-2, 0, 2],[-1, 0, 1]])sobel_2 = np.array([[-1, -2, -1],[0, 0, 0],[1, 2, 1]])
# prewitt 算子
prewitt_1 = np.array([[-1, 0, 1],[-1, 0, 1],[-1, 0, 1]])prewitt_2 = np.array([[-1, -1, -1],[0, 0, 0],[1, 1, 1]])# ######################均值滤波################################
# 读图片
image = cv2.imread('balloonGrayNoisy.jpg', cv2.IMREAD_GRAYSCALE)
# 均值滤波
img_k3 = imgAverageFilter(image, kernel_3x3)# 写图片
cv2.imwrite('average_3x3.jpg', img_k3)
# 均值滤波
img_k5 = imgAverageFilter(image, kernel_5x5)
# 写图片
cv2.imwrite('average_5x5.jpg', img_k5)######################高斯滤波################################
image = cv2.imread('balloonGrayNoisy.jpg', cv2.IMREAD_GRAYSCALE)
img_gaus1 = imgAverageFilter(image, imgGaussian(1))
cv2.imwrite('gaussian1.jpg', img_gaus1)
img_gaus2 = imgAverageFilter(image, imgGaussian(2))
cv2.imwrite('gaussian2.jpg', img_gaus2)
img_gaus3 = imgAverageFilter(image, imgGaussian(3))
cv2.imwrite('gaussian3.jpg', img_gaus3)######################Sobel算子################################
image=cv2.imread('buildingGray.jpg',cv2.IMREAD_GRAYSCALE)
img_spbel1 = sobelEdge(image, sobel_1)
cv2.imwrite('sobel1.jpg',img_spbel1)
img_spbel2 = sobelEdge(image, sobel_2)
cv2.imwrite('sobel2.jpg',img_spbel2)######################prewitt算子################################
img_prewitt1 = prewittEdge(image, prewitt_1,prewitt_2)
cv2.imwrite('prewitt1.jpg',img_prewitt1)

http://chatgpt.dhexx.cn/article/3vR3JIpQ.shtml

相关文章

几种边缘检测算子的比较Roberts,Sobel,Prewitt,LOG,Canny

from:https://blog.csdn.net/gdut2015go/article/details/46779251 边缘检测是图像处理和计算机视觉中的基本问题,边缘检测的目的是标识数字图像中亮度变化明显的点。图像属性中的显著变化通常反映了属性的重要事件和变化。这些包括:深度上的…

prewitt算子实现

原理&#xff1a; 实现&#xff1a; /*** description: prewitt算子* param src 输入图像* param dst 输出图像*/ void prewitt(cv::Mat& src, cv::Mat& dst) {cv::Mat getPrewitt_horizontal (cv::Mat_<float>(3, 3) << -1, -1, -1, 0, 0, 0, 1, 1, …

数字图像处理——Sobel算子锐化、Prewitt算子锐化

数字图像处理——Sobel算子锐化、Prewitt算子锐化 一、Sobel算子锐化 %函数名称为Image_Sobel,输入参数Image,输出参数IMAGE function [IMAGE] Image_Sobel(Image) %获取矩阵的行、列、波段数 [m,n,bands] size(Image); %定义模板大小&#xff0c;假设模板大小33 A 1; %定义…

Python 图像处理 OpenCV (12): Roberts 算子、 Prewitt 算子、 Sobel 算子和 Laplacian 算子边缘检测技术

前文传送门&#xff1a; 「Python 图像处理 OpenCV &#xff08;1&#xff09;&#xff1a;入门」 「Python 图像处理 OpenCV &#xff08;2&#xff09;&#xff1a;像素处理与 Numpy 操作以及 Matplotlib 显示图像」 「Python 图像处理 OpenCV &#xff08;3&#xff09;&…

[Python从零到壹] 五十七.图像增强及运算篇之图像锐化Roberts、Prewitt算子实现边缘检测

欢迎大家来到“Python从零到壹”&#xff0c;在这里我将分享约200篇Python系列文章&#xff0c;带大家一起去学习和玩耍&#xff0c;看看Python这个有趣的世界。所有文章都将结合案例、代码和作者的经验讲解&#xff0c;真心想把自己近十年的编程经验分享给大家&#xff0c;希望…

Prewitt算子计算图像梯度

Prewitt算子是一阶微分算子的边缘检测&#xff0c;利用像素点上下、左右邻点的灰度差&#xff0c;在边缘处达到极值检测边缘&#xff0c;去掉部分伪边缘&#xff0c;对噪声具有平滑作用。其原理是在图像空间利用两个方向模板与图像进行邻域卷积来完成&#xff0c;这两个方向模板…

opencv-6 边缘检测(Prewitt算子,Sobel算子,Laplacian算子)

Roberts filter2D形式实现 import cv2 import numpy as np import matplotlib.pyplot as pltimg cv2.imread(lena.jpg) lenna_img cv2.cvtColor(img,cv2.COLOR_BGR2RGB) grayImage cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)kernelx np.array([[-1,0],[0,1]],dtypeint) kernely…

梯度与Roberts、Prewitt、Sobel、Lapacian算子

一、学习心得&#xff1a; 学习图像处理的过程中&#xff0c;刚开始遇到图像梯度和一些算子的概念&#xff0c;这两者到底是什么关系&#xff0c;又有什么不同&#xff0c;一直困扰着我。后来在看到图像分割这一模块后才恍然大悟&#xff0c;其实图像的梯度可以用一阶导数和二…

【计算机视觉】图像分割与特征提取——基于Roberts、Prewitt、Sobel算子的图像分割实验

个人简介&#xff1a; > &#x1f4e6;个人主页&#xff1a;赵四司机 > &#x1f3c6;学习方向&#xff1a;JAVA后端开发 > ⏰往期文章&#xff1a;SpringBoot项目整合微信支付 > &#x1f514;博主推荐网站&#xff1a;牛客网 刷题|面试|找工作神器 > &#…

边缘检测——Prewitt算子

垂直水平方向边缘 垂直水平方向的Prewitt算子是可分离的卷积核。 45、135方向边缘 算子不可分割。 缺点 没有充分利用边缘的梯度方向最后输出的边缘二值图&#xff0c;只是简单地利用阈值进行处理。如果阈值过大&#xff0c;则会损失很多边缘信息&#xff1b;如果阈值过…

数字图像处理(19): 边缘检测算子(Roberts算子、Prewitt算子、Sobel算子 和 Laplacian算子)

目录 1 边缘检测的基本原理 2 边缘检测算子分类 3 梯度 3.1 图像梯度 3.2 梯度算子 4 Roberts 算子 4.1 基本原理 4.2 代码示例 5 Prewitt 算子 5.1 基本原理 5.2 代码示例 6 Sobel 算子 6.1 基本原理 6.2 代码示例 7 Laplacian 算子 7.1 基本原理 7.2 代码示…

python数字图像处理——边缘检测算子(Laplacian算子、Roberts算子、Prewitt算子和Sobel算子)

1.Laplacian算子 拉普拉斯&#xff08;Laplacian&#xff09;算子是n维欧几里德空间中的一个二阶微分算子&#xff0c;常用于图像增强领域和边缘提取。它通过灰度差分计算邻域内的像素&#xff0c;基本流程是&#xff1a;判断图像中心像素灰度值与它周围其他像素的灰度值&…

Prewitt算子边缘检测原理及实现

写在前面 Prewitt算子同样也是一种一阶微分算子&#xff0c;利用像素点上下左右邻点灰度差&#xff0c;在边缘处达到极值检测边缘&#xff0c;对噪声具有平滑的作用。 原理 其原理是在图像空间利用两个方向模板与图像进行邻域卷积来完成的&#xff0c;这两个方向模板一个检测…

Prewitt和Sobel算子

在3*3模板中&#xff1a; 我如下定义水平、垂直和两对角线方向的梯度&#xff1a; 该定义下的算子称之为Prewitt算子&#xff1a; Sobel算子是在Prewitt算子的基础上改进的&#xff0c;在中心系数上使用一个权值2&#xff0c;相比较Prewitt算子&#xff0c;Sobel模板能够较好…

Prewitt边缘检测算子

Prewitt算子也是一种一阶微分算子&#xff0c;用于边缘检测。与Robert使用22的模板不同&#xff0c;Prewitt算子使用的是33的模板&#xff0c;利用像素点上下、左右邻点的灰度差来检测边缘&#xff0c;故其边缘检测结果在水平方向和垂直方向均比Robert算子更加明显。 其数学表…

图像边缘检测之Prewitt算子

Prewitt 算子 1. 原理 Prewitt算子是一种图像边缘检测的微分算子&#xff0c;其原理是利用特定区域内像素灰度值产生的差分实现边缘检测。由于Prewitt算子采用 3x3 模板对区域内的像素值进行计算&#xff0c;而Robert算子的模板为 2x2&#xff0c;故Prewitt算子的边缘检测结果…

华为--配置本地环回接口地址

该实验紧接上一节实验 网络拓扑图如下 AR1环回接口配置 AR2环回接口配置 AR3环回接口配置 配置AR1回环接口路由 配置AR2回环接口路由 配置AR3回环接口路由 在AR1上测试回环接口的连通性 在AR2上测试回环接口的连通性 在AR3上测试回环接口的连通性 测试成功 转载于:https://my.o…

【LINUX】ifconfig只有本地环回地址问题的解决方法

问题描述&#xff1a; ifconfig只有lo&#xff0c;没有看到ens33 ifconfig -a看到了ens33&#xff0c;但是没有地址 解决方法&#xff1a; &#xff08;1&#xff09;stop network-manager sudo service network-manager stop &#xff08;2&#xff09;删除旧有的网络配置…

怎么判断一个ipv4地址是 私有地址,环回地址,实验地址,TEST-NET地址,本地链路地址?

问题的提出&#xff1a; 理论讲解(黄色的为上题的答案&#xff09;&#xff1a; IP地址分为五类&#xff1a; A类保留给政府机构&#xff0c;B类分配给中等规模的公司&#xff0c;C类分配给任何需要的人&#xff0c;D类用于组播&#xff0c;E类用于实验&#xff0c;各类可容纳…

回环地址 127.0.0.1

控制台输入ping 127.0.0.1。 $ ping 127.0.0.1 PING 127.0.0.1 (127.0.0.1): 56 data bytes 64 bytes from 127.0.0.1: icmp_seq0 ttl64 time0.080 ms 64 bytes from 127.0.0.1: icmp_seq1 ttl64 time0.093 ms 64 bytes from 127.0.0.1: icmp_seq2 ttl64 time0.074 ms 64 byte…