Python实战:5种常用卷积核效果对比(附完整代码)

# Python实战:5种常用卷积核效果对比(附完整代码) 最近在整理图像处理项目时,我翻出了几年前写的一个卷积核测试脚本。当时为了理解不同卷积核到底对图像做了什么,我几乎把能找到的核都试了一遍,结果发现,很多教程只是罗列公式,真正动手跑一遍代码,看到图像在眼前变化,那种理解是完全不同的。今天,我们就来一次实战演练,抛开复杂的数学推导,直接用Python代码实现五种最核心的卷积核,并直观对比它们的视觉差异。无论你是刚接触计算机视觉的Python开发者,还是想巩固基础的老手,这篇文章都将带你从“知道”走向“做到”。 我们将从最基础的卷积操作实现开始,逐步应用五种功能迥异的卷积核:从保持原样的**恒等核**,到平滑图像的**均值与高斯模糊**,再到提取特征的**Sobel边缘检测**,最后是增强细节的**锐化核**。我会提供每一步的完整代码、清晰的注释,并重点分析每种核处理后图像的“视觉故事”。你会发现,理解卷积核,最好的方式就是亲手让它运行起来。 ## 1. 环境准备与卷积原理速览 在开始写代码之前,我们需要确保手头的“工具箱”是齐全的。这个项目对环境要求并不苛刻,但使用科学计算和图像处理的经典组合会让事情变得事半功倍。我个人的习惯是使用Anaconda来管理环境,它能很好地处理包依赖问题。 首先,我们创建一个干净的Python环境(这里以conda为例,用pip virtualenv也一样),并安装核心库: ```bash # 创建并激活一个名为`cv_conv`的虚拟环境 conda create -n cv_conv python=3.9 conda activate cv_conv # 安装必要的库 pip install numpy matplotlib scikit-image opencv-python ``` * `numpy`: 所有矩阵和数值运算的基石,我们的卷积操作本质上就是数组计算。 * `matplotlib`: 用于可视化,让我们能直观地看到图像处理前后的对比。 * `scikit-image`: 一个强大的图像处理库,这里我们主要用它来方便地加载一些内置的标准测试图像。 * `opencv-python`: 虽然本次我们手动实现卷积来加深理解,但安装OpenCV可以作为后续验证和扩展的备用方案。 安装完成后,可以在Python交互环境中快速测试一下: ```python import numpy as np import matplotlib.pyplot as plt from skimage import data print("所有库已就绪!") ``` 接下来,我们用几分钟快速理解一下卷积的核心概念。你可以把一张灰度图像想象成一个巨大的数字矩阵,每个像素点就是一个数值(代表亮度)。**卷积核**则是一个小得多的矩阵(比如3x3, 5x5)。卷积操作,就是让这个小核在大的图像矩阵上“滑动”。 在每一个停留的位置,将核覆盖的局部图像区域像素值,与核矩阵对应位置的值相乘,然后把所有乘积结果加起来,得到一个新的像素值,并放在输出图像对应的中心位置。这个过程周而复始,直到遍历完整张图像。 > 注意: 为了处理图像边缘的像素,我们通常需要进行“填充”(Padding)。最常用的方法是补零(Zero-padding),即在图像外围包裹一圈0值像素,这样卷积核就能滑到边缘像素的中心了。我们后续的代码会实现这个细节。 这个看似简单的“滑动窗口乘加”操作,因为卷积核内数值的不同,能产生千变万化的效果。核里的数字,就像厨师手中的调料配方,不同的配比,烹制出完全不同的视觉“菜肴”。 ## 2. 手动实现卷积函数:从零开始理解过程 很多教程直接调用`cv2.filter2D`或`scipy.signal.convolve2d`,这当然高效,但对于理解本质帮助有限。我强烈建议在初学阶段,自己动手实现一遍基础的卷积函数。这不仅能帮你彻底搞懂边界处理、矩阵运算等细节,以后遇到性能调优或自定义特殊核时,你也能心中有数。 下面这个`my_conv2d`函数,是我经过几次迭代后觉得比较清晰的一个版本。它接受一个图像矩阵和一个卷积核,返回处理后的图像。我们一步步来拆解: ```python import numpy as np def my_conv2d(image, kernel, padding='same'): """ 手动实现的二维卷积函数。 参数: image: 输入图像,二维NumPy数组(灰度图)。 kernel: 卷积核,二维NumPy数组,通常为奇数尺寸(如3x3, 5x5)。 padding: 填充方式,'same'表示输出尺寸与输入相同,'valid'表示不填充。 返回: output: 卷积后的图像。 """ # 获取图像和卷积核的尺寸 img_h, img_w = image.shape kernel_h, kernel_w = kernel.shape # 计算需要填充的宽度。为了保持输出尺寸不变,需要在上下左右各填充 (k_size-1)//2 pad_h = (kernel_h - 1) // 2 pad_w = (kernel_w - 1) // 2 if padding == 'same': # 进行零填充 padded_img = np.pad(image, ((pad_h, pad_h), (pad_w, pad_w)), mode='constant', constant_values=0) elif padding == 'valid': padded_img = image # 对于‘valid’模式,输出尺寸会缩小,这里不展开,我们先使用‘same’模式 else: raise ValueError("padding参数应为‘same‘或‘valid‘") # 初始化输出图像 output_h = img_h if padding == 'same' else img_h - kernel_h + 1 output_w = img_w if padding == 'same' else img_w - kernel_w + 1 output = np.zeros((output_h, output_w)) # 获取填充后图像的尺寸 padded_h, padded_w = padded_img.shape # 核心卷积计算:滑动窗口 for i in range(output_h): for j in range(output_w): # 提取当前卷积核覆盖的图像区域 region = padded_img[i:i+kernel_h, j:j+kernel_w] # 执行元素级乘法并求和(这就是卷积的点积运算) output[i, j] = np.sum(region * kernel) # 对于某些核(如边缘检测),结果可能出现负值或超出[0,255]范围。 # 为了正确显示,我们通常将其缩放到[0, 255]并转换为uint8。 # 但注意:这一步不是卷积运算的一部分,只是为了可视化。 output_visual = np.clip(output, 0, 255).astype(np.uint8) # 简单裁剪法,更复杂的可用归一化 return output_visual ``` 这个函数的关键点在于`np.pad`进行零填充,以及双重循环中的`np.sum(region * kernel)`,这正是卷积“乘加和”的本质。虽然用循环实现效率不高(生产环境请务必使用优化过的库函数),但它的教育意义无可替代。 写好了“引擎”,接下来我们准备“燃料”——测试图像。我们将使用`skimage.data.camera()`(一张经典的摄影师灰度图)和`skimage.data.chelsea()`(一只小猫的彩色图,我们会将其转为灰度)作为测试对象。 ```python from skimage import data, color # 加载测试图像 img_camera = data.camera() # 已经是灰度图 img_cat = data.chelsea() # 彩色图 img_cat_gray = color.rgb2gray(img_cat) * 255 # 转为灰度并缩放到0-255范围 img_cat_gray = img_cat_gray.astype(np.uint8) # 可视化原图 fig, axes = plt.subplots(1, 2, figsize=(10, 5)) axes[0].imshow(img_camera, cmap='gray') axes[0].set_title('Camera (灰度)') axes[0].axis('off') axes[1].imshow(img_cat_gray, cmap='gray') axes[1].set_title('Cat (灰度)') axes[1].axis('off') plt.show() ``` 万事俱备,现在让我们请出第一位“演员”:恒等核。 ## 3. 五种核心卷积核实战与效果深度解析 ### 3.1 基准测试:恒等核(Identity Kernel) 恒等核是所有卷积核中最简单,也最重要的一位。它就像一面完美的镜子,目的是让图像原封不动地通过。这有什么用呢?主要用来验证我们的卷积函数是否正确。如果连恒等核都无法输出原图,那说明我们的卷积实现逻辑有根本错误。 它的结构非常简单,中心为1,周围全为0。对于一个3x3的核: ```python kernel_identity = np.array([ [0, 0, 0], [0, 1, 0], [0, 0, 0] ]) ``` 让我们用代码测试一下: ```python # 应用恒等核 result_identity = my_conv2d(img_camera, kernel_identity, padding='same') # 对比原图与结果 fig, axes = plt.subplots(1, 3, figsize=(12, 4)) axes[0].imshow(img_camera, cmap='gray') axes[0].set_title('原始图像') axes[0].axis('off') axes[1].imshow(result_identity, cmap='gray') axes[1].set_title('恒等核处理结果') axes[1].axis('off') # 计算差异(理论上应为全零) difference = img_camera.astype(float) - result_identity.astype(float) axes[2].imshow(difference, cmap='gray', vmin=-1, vmax=1) # 调整显示范围以看清微小差异 axes[2].set_title('差异图 (放大显示)') axes[2].axis('off') plt.show() print(f"最大差异值: {np.max(np.abs(difference))}") ``` 如果实现正确,`result_identity`应该和`img_camera`肉眼完全一致,且差异图几乎全黑,最大差异值是一个极小的浮点数(由于数值计算精度导致)。通过这个测试,我们就对自己的卷积函数建立了信心。 ### 3.2 平滑艺术:均值模糊 vs. 高斯模糊 平滑(模糊)是图像处理中最常用的操作之一,主要用于降噪或创造柔化效果。最经典的两种模糊方式是均值模糊和高斯模糊,它们背后的哲学截然不同。 **均值模糊核** 的思想是“平均主义”。在一个3x3的窗口内,它给每个像素平等的投票权,取平均值作为中心像素的新值。这能快速平滑掉尖锐的噪声,但代价是会让图像变得有些“呆板”,边缘也容易模糊。 ```python # 3x3 均值模糊核 kernel_box_blur = np.ones((3, 3), dtype=np.float32) / 9.0 print("均值模糊核:\n", kernel_box_blur) ``` **高斯模糊核** 则更为“智慧”。它认为,距离中心越近的像素,对中心像素的影响应该越大。因此,它用一个二维高斯函数来生成核的权重,中心权重最高,向四周呈钟形曲线衰减。这种加权平均的方式,能在平滑图像的同时,更好地保留边缘的对比度,效果看起来更自然。 下面我们生成一个5x5的高斯核。这里我们不从零开始推导高斯函数,而是直接用`cv2.getGaussianKernel`来生成一维高斯核,然后通过外积得到二维核。 ```python import cv2 # 生成一维高斯核 gaussian_1d = cv2.getGaussianKernel(ksize=5, sigma=1.0) # 通过外积生成二维高斯核 kernel_gaussian_blur = gaussian_1d * gaussian_1d.T print("5x5 高斯模糊核 (已归一化):\n", kernel_gaussian_blur) print("核元素总和 (应为1):", np.sum(kernel_gaussian_blur)) ``` 现在,让我们将这两种模糊核同时应用到小猫图像上,看看直观区别: ```python result_box_cat = my_conv2d(img_cat_gray, kernel_box_blur, padding='same') result_gaussian_cat = my_conv2d(img_cat_gray, kernel_gaussian_blur, padding='same') fig, axes = plt.subplots(1, 3, figsize=(15, 5)) axes[0].imshow(img_cat_gray, cmap='gray') axes[0].set_title('原始图像') axes[0].axis('off') axes[1].imshow(result_box_cat, cmap='gray') axes[1].set_title('均值模糊 (3x3)') axes[1].axis('off') axes[2].imshow(result_gaussian_cat, cmap='gray') axes[2].set_title('高斯模糊 (5x5, sigma=1.0)') axes[2].axis('off') plt.show() ``` 仔细观察小猫的胡须、眼睛边缘和背景纹理。你会发现,**均值模糊**后的图像整体均匀地变“糊”,像隔了一层磨砂玻璃。而**高斯模糊**的图像,在平滑的同时,主体轮廓依然相对清晰,过渡更柔和,更像专业相机的大光圈浅景深效果。这就是加权平均的魅力。 为了更量化地对比,我们可以看看它们对图像高频成分(如边缘)的抑制能力。一个简单的办法是计算处理后图像的梯度幅值(例如用Sobel算子,我们接下来会讲)是否下降得更快。 ### 3.3 特征提取利器:Sobel边缘检测核 如果说模糊核是让图像“静下来”,那么边缘检测核就是让图像的“骨架”凸显出来。Sobel算子是边缘检测的经典方法,它本质上是一个离散的差分算子,用来近似图像灰度函数的梯度。 Sobel通常包含两个核:一个用于检测**水平方向**的边缘(对垂直变化敏感),另一个用于检测**垂直方向**的边缘(对水平变化敏感)。 ```python # Sobel 算子 kernel_sobel_x = np.array([ # 检测垂直边缘(水平方向梯度) [-1, 0, 1], [-2, 0, 2], [-1, 0, 1] ], dtype=np.float32) kernel_sobel_y = np.array([ # 检测水平边缘(垂直方向梯度) [-1, -2, -1], [ 0, 0, 0], [ 1, 2, 1] ], dtype=np.float32) ``` * `Sobel_X`: 为什么它能检测垂直边缘?想象一个黑白交界处(垂直边缘),左侧是黑(低像素值),右侧是白(高像素值)。当这个核滑过时,左侧的负权重与低值相乘得负值,右侧的正权重与高值相乘得正值,求和后得到一个很大的正数,表明此处有一个从左到右的亮度跃升(边缘)。对于水平方向的均匀区域,左右两侧贡献抵消,响应接近零。 * `Sobel_Y`: 原理类似,它对图像中水平方向的亮度变化(即垂直边缘)敏感。 单独使用任何一个核,得到的是某个方向的边缘信息。在实际应用中,我们通常结合两者来计算梯度的幅值和方向: ```python # 分别计算x和y方向的梯度 grad_x = my_conv2d(img_camera, kernel_sobel_x, padding='same') grad_y = my_conv2d(img_camera, kernel_sobel_y, padding='same') # 计算梯度幅值 (近似) grad_magnitude = np.sqrt(grad_x.astype(float)**2 + grad_y.astype(float)**2) # 归一化到0-255以便显示 grad_magnitude = np.clip(grad_magnitude, 0, 255).astype(np.uint8) # 计算梯度方向 (弧度) grad_direction = np.arctan2(grad_y.astype(float), grad_x.astype(float)) fig, axes = plt.subplots(2, 2, figsize=(10, 10)) axes[0, 0].imshow(img_camera, cmap='gray') axes[0, 0].set_title('原始图像') axes[0, 0].axis('off') axes[0, 1].imshow(grad_x, cmap='gray') axes[0, 1].set_title('Sobel X (垂直边缘)') axes[0, 1].axis('off') axes[1, 0].imshow(grad_y, cmap='gray') axes[1, 0].set_title('Sobel Y (水平边缘)') axes[1, 0].axis('off') axes[1, 1].imshow(grad_magnitude, cmap='gray') axes[1, 1].set_title('梯度幅值 (综合边缘)') axes[1, 1].axis('off') plt.tight_layout() plt.show() ``` 在结果图中,`Sobel X`图像中人物的垂直轮廓(如鼻子侧面、肩膀线条)非常清晰,而`Sobel Y`图像则突出了水平方向的边缘(如帽檐、眼睛、嘴巴)。最终的**梯度幅值**图融合了所有方向的边缘信息,构成了我们常说的“边缘检测”结果。这幅图清晰地勾勒出了人物的主要轮廓,是后续许多高级视觉任务(如物体识别、图像分割)的宝贵输入。 > 提示: Sobel算子的结果通常包含负值和超过255的值。我们的`my_conv2d`函数末尾的`np.clip`是一种简单的可视化处理。更严谨的做法是先保留浮点结果,进行归一化(如缩放到0-1或0-255)后再显示,这样可以保留更多的梯度强度信息。 ### 3.4 细节增强:锐化核(Sharpen Kernel) 有时候我们需要的不是模糊或提取边缘,而是让图像看起来更清晰、细节更分明。这时就需要锐化核。它的设计思路很有趣:**通过增强图像中的高频部分(即细节和边缘)来对抗模糊**。 一个典型的3x3锐化核如下: ```python kernel_sharpen = np.array([ [ 0, -1, 0], [-1, 5, -1], [ 0, -1, 0] ], dtype=np.float32) ``` 这个核可以看作是由两部分组成:一个强烈的**中心正权重**(这里是5),加上周围负权重的**包围**。我们来分析一下它的工作原理: 1. **中心突出**:中心像素的权重远大于1(恒等核中心是1),这直接放大了该像素本身的值。 2. **邻域抑制**:周围的负权重(-1)实际上是在减去邻域像素的平均值。这相当于从中心像素中减去了一个局部模糊的版本。 回想一下,**“原始信号 - 模糊信号 ≈ 高频细节(边缘)”**。所以,这个操作等价于:`增强后的像素 = 原始像素 + λ * (原始像素 - 模糊像素)`。其中`λ`是一个控制锐化强度的系数。在我们的核中,这个关系被编码在了权重里。 让我们看看它对一张稍微有些模糊的图像(比如我们先做一次轻微高斯模糊)的效果: ```python # 先对图像做轻微模糊,模拟细节丢失 img_blurred = my_conv2d(img_cat_gray, kernel_gaussian_blur, padding='same') # 再对模糊后的图像进行锐化 img_sharpened = my_conv2d(img_blurred, kernel_sharpen, padding='same') fig, axes = plt.subplots(1, 3, figsize=(15, 5)) axes[0].imshow(img_cat_gray, cmap='gray') axes[0].set_title('原始清晰图像') axes[0].axis('off') axes[1].imshow(img_blurred, cmap='gray') axes[1].set_title('轻微高斯模糊后') axes[1].axis('off') axes[2].imshow(img_sharpened, cmap='gray') axes[2].set_title('锐化处理后') axes[2].axis('off') plt.show() ``` 你会发现,锐化后的图像比模糊图清晰了许多,毛发和眼睛的细节得到了恢复。但和原图对比,锐化图可能会在边缘处产生轻微的“过冲”或“光环”效应,这是增强高频分量的副作用。在实际应用中,锐化的强度需要谨慎调节,过度锐化会使图像看起来不自然,并放大噪声。 ## 4. 综合对比与性能优化思考 我们已经逐一领略了五种卷积核的风采。现在,让我们把它们放在同一个舞台上,进行一场直观的“阅兵式”对比。下表总结了它们的核心特性、视觉作用和典型应用场景: | 卷积核类型 | 核心矩阵示例 (3x3) | 主要视觉作用 | 关键参数/变体 | 典型应用场景 | | :--- | :--- | :--- | :--- | :--- | | **恒等核** | `[[0,0,0],[0,1,0],[0,0,0]]` | 无变化,输出等于输入 | 无 | 算法验证、基准测试 | | **均值模糊** | `[[1/9,1/9,1/9], ...]` | 均匀平滑,降低噪声和细节 | 核尺寸 (3,5,7...) | 快速降噪、预处理 | | **高斯模糊** | 由高斯函数生成 | 加权平滑,保边性更好 | 核尺寸、标准差(σ) | 高级降噪、尺度空间构建、模拟景深 | | **Sobel边缘检测** | X: `[[-1,0,1],[-2,0,2],[-1,0,1]]` | 提取特定方向的边缘 | 方向 (X/Y) | 特征提取、梯度计算、计算机视觉预处理 | | **锐化核** | `[[0,-1,0],[-1,5,-1],[0,-1,0]]` | 增强细节和边缘对比度 | 中心增益强度 | 图像增强、修复轻微模糊 | 为了更直观地感受,我们最后用一段代码,在摄影师图像上一次性运行所有五种核,并排显示结果: ```python kernels = { "恒等核": kernel_identity, "均值模糊 (3x3)": kernel_box_blur, "高斯模糊 (5x5)": kernel_gaussian_blur, "Sobel X": kernel_sobel_x, "锐化核": kernel_sharpen } results = {} for name, kernel in kernels.items(): results[name] = my_conv2d(img_camera, kernel, padding='same') # 绘制对比图 fig, axes = plt.subplots(2, 3, figsize=(15, 10)) axes = axes.ravel() titles = ['原始图像'] + list(kernels.keys()) for idx, title in enumerate(titles): ax = axes[idx] if idx == 0: ax.imshow(img_camera, cmap='gray') else: ax.imshow(results[titles[idx]], cmap='gray') ax.set_title(title) ax.axis('off') # 隐藏多余的子图 for idx in range(len(titles), len(axes)): axes[idx].axis('off') plt.tight_layout() plt.show() ``` 这张对比图非常具有说服力。从**恒等核**的忠实复刻,到**均值模糊**的均匀涂抹,再到**高斯模糊**的自然柔化,接着是**Sobel X**将轮廓抽象成线条,最后**锐化核**让细节更加咄咄逼人。一个简单的滑动窗口乘加操作,因内核权重的不同,竟能演绎出如此丰富的视觉语言。 最后,谈谈性能。我们手动实现的`my_conv2d`函数使用了双重循环,在大型图像上会非常慢。在生产环境中,我们应使用高度优化的库函数。例如,在OpenCV中,等价的操作为: ```python import cv2 # 使用OpenCV的filter2D函数,速度极快 result_cv2 = cv2.filter2D(img_camera, -1, kernel_sharpen, borderType=cv2.BORDER_CONSTANT) ``` `cv2.filter2D`底层通常利用了SIMD指令和高度优化的算法,比纯Python循环快几个数量级。理解原理后,放心使用这些工业级工具吧。 卷积核的世界远不止这五种,还有拉普拉斯核(用于二阶边缘检测)、浮雕核、运动模糊核等等。但掌握了这五种最核心的核,你就已经拿到了打开传统图像处理大门的钥匙。下次当你需要处理图像时,不妨先想想:我是想让它更平滑、更清晰,还是想找出它的轮廓?想清楚了,选择合适的卷积核,几行代码就能实现。动手试试,调整核的尺寸和参数,观察图像如何随之舞蹈,这才是学习图像处理最有趣的部分。

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

Python内容推荐

Retinex算法:用于 MSRCR、MSRCP 的python代码

Retinex算法:用于 MSRCR、MSRCP 的python代码

执行/demo.py,见 /code/retinex.py 中的代码和注释

真正理解卷积 (附python实现代码)

真正理解卷积 (附python实现代码)

如果还不清楚卷积在生活中的意义,可以看看这则转载自疯子朱磊的比喻。 首先看定义和公式 卷积就是以一个函数为输入函数,在输入函数每个点上,以输入函数为系数叠加位移了的响应函数,最终得到的函数。 哇,相当抽象, 这是个啥,这又是个啥?好的先不着急弄清楚这符号是什么。先清楚这个符号代表卷积运算就行。那卷积的运算结果是什么?也就是这个东西最终会等于什么?大家学过积分的认真看这个这个东西是什么?是这个东西关于的积分,他的结果将会是关于n的一个函数,什么意思?就是卷积结果不会是一个固定的值,而是关于n的函数,n取不同值它的结果也会不同。比如说卷积结果是2n+1,那当n等于0时,卷积结果就是1,当n等于

基于python2.7的LeNet5源代码实现

基于python2.7的LeNet5源代码实现

基于python2.7的LeNet5源代码实现,效果很不错。

Tensorflow卷积实现原理+手写python代码实现卷积教程

Tensorflow卷积实现原理+手写python代码实现卷积教程

从一个通道的图片进行卷积生成新的单通道图的过程很容易理解,对于多个通道卷积后生成多个通道的图理解起来有点抽象。本文以通俗易懂的方式讲述卷积,并辅以图片解释,能快速理解卷积的实现原理。最后手写python代码实现卷积过程,让Tensorflow卷积在我们面前不再是黑箱子! 注意: 本文只针对batch_size=1,padding=’SAME’,stride=[1,1,1,1]进行实验和解释,其他如果不是这个参数设置,原理也是一样。 1 Tensorflow卷积实现原理 先看一下卷积实现原理,对于in_c个通道的输入图,如果需要经过卷积后输出out_c个通道图,那么总共需要in_c * out_

基于Pyqt5+Python开发的输入图片和卷积核输出经过卷积后的图片源码(带GUI界面)+项目说明.zip

基于Pyqt5+Python开发的输入图片和卷积核输出经过卷积后的图片源码(带GUI界面)+项目说明.zip

基于Pyqt5+Python开发的输入图片和卷积核输出经过卷积后的图片源码(带GUI界面)+项目说明.zip 【优质项目推荐】 1.项目代码功能经验证ok,确保稳定可靠运行。欢迎下载使用!在使用过程中,如有问题或建议,请及时私信沟通,帮助解答。 2.项目主要针对各个计算机相关专业,包括计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网等领域的在校学生、专业教师或企业员工使用。 3.项目具有丰富的拓展空间,不仅可作为入门进阶,也可直接作为毕设、课程设计、大作业、项目初期立项演示等用途。 4.如果基础还行,或热爱钻研,可基于此项目进行二次开发,DIY其他不同功能。 基于Pyqt5+Python开发的输入图片和卷积核输出经过卷积后的图片源码(带GUI界面)+项目说明.zip 功能 用pyqt5和opencv写出来的一个小东西,选择图片和输入卷积核之后输出卷积之后的图片 ## 编写过程中的一些事情 1. 解释器版本是python 3.9.13 2. 那个ui.py是把a_test.ui转成py之后,修改一点显示信息得到的 3. 用pyinstaller打包得到exe,过程中碰上了一些问题,把版本退回4.10得以解决 4. 本工程使用的环境是anaconda环境,据说使用upx可以减小一点体积(未知,待求证) ## 大致结构 1. 使用了两个自己写的类,myWin和myConvThread 1.1 myWin继承了两个类,分别是QWidget和Ui_Form;Ui_Form类是把.ui文件转成.py文件之后得到的 1.1.1 myWin的各个函数基本上分为两类:对各个控件的初始化以及槽函数的绑定、槽函数实现 1.2 myConvThread类继承自QThread 1.2.1 其中run函数是一个死循环,正常情况下会在这个死循环中,啥也不干,单纯活着 1.2.2 logic_of_request函数则是在接收到主函数的click_of_conv函数发来的消息之后,把发来的图像和卷积核传给位于myOpencv.py的conv函数,然后接收返回的图像,并显示 2. 主函数很简单,就是创建-显示-循环直到关闭窗口

Python实现基于CNN-KELM(卷积核极限学习机)的图像分类预测的详细项目实例(包含详细的完整的程序和数据)

Python实现基于CNN-KELM(卷积核极限学习机)的图像分类预测的详细项目实例(包含详细的完整的程序和数据)

内容概要:本文详细讲解了一个利用Python实现CNN-KELM(卷积核极限学习机)完成图像分类的实际项目,涉及模型介绍、设计原理论述、数据分析准备步骤及其集成实现。此项目通过组合CNN(主要用于识别图像的关键属性)、ELM(用作迅速有效的图像类型判断器),提供一种新的视觉识别解决方案,具体展示了从搭建到训练以及最终评估整个流程。 适合人群:拥有一定程度Python基础知识及机器学习经验的研究员和技术爱好者。 使用场景及目标:适合于对提升图片分类任务有特定需要的场合,旨在探索和运用新颖高效的分类技巧,在真实环境中达到更优化的表现。 其他说明:本文不仅介绍了具体的代码片段与数据配置指导,还分享了实际操作过程中可能遇见的一些注意事项及改进方式,有助于初学者快速理解和应用这项先进的图像分类手段。

CNN实现图片分类,python代码

CNN实现图片分类,python代码

CNN实现图片分类,用tensorflow python实现,目前是三类,可以增加类别。

Python新闻等文本情感分析实战源码分享

Python新闻等文本情感分析实战源码分享

本项目通过textcnn卷积神经网络实现对文本情感分析识别,由python 3.6.5+Pytorch训练所得。

RESNET、GOOGLENET等Python代码实现

RESNET、GOOGLENET等Python代码实现

懒得描述了,ResNet,GoogleNet等网络结构的Python实现,很好的资源

卷积神经网络python代码

卷积神经网络python代码

卷积神经网络 python代码 代码代码 代码。。。。。

图像平滑-导向滤波与快速导向滤波对比_导向滤波_opencv_快速导向滤波_python_

图像平滑-导向滤波与快速导向滤波对比_导向滤波_opencv_快速导向滤波_python_

基于python的导向滤波与快速导向滤波算法

python+opencv实现高斯平滑滤波

python+opencv实现高斯平滑滤波

主要为大家详细介绍了python+opencv实现高斯平滑滤波,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

卷积python1

卷积python1

第一步:将局部敞口的数据拉伸为行向量, 然后比哪里每个特征图的的每一个数据窗口, 第二步:卷积核组拉伸为列向量 第三步:矩阵相乘和ReLU非线性激活 第四步:将

Python银行卡数字识别项目  (Opencv)

Python银行卡数字识别项目 (Opencv)

项目预览: QWQ 那么第一步先梳理一下我们的项目逻辑: 一. 找素材 (数字模板,银行卡照片等) 二. 识别数字则需要我们对数字模板进行处理。因此下面我们开始处理数字模板。 1.将数字模板处理成灰度图,再进行二值处理.这样图像就变成双通道图. 2.计算模板边缘轮廓.将数字模板每个数字的轮廓计算出来. 3.画出每个数字轮廓的外接矩形。最后将其分别保存到一个字典里. 三. 数字模板处理完成,已经洗净切块备用啦!现在让我们处理正餐-银行卡。 1.和模板一样先进行图像处理.灰度图 —— 二值处理 2.初始化一个(9,3)和(5,5)的卷积核放在旁边备用. 3.将已经处理的银行卡图像进行礼帽操作,去

Opencv+Python实现图像运动模糊和高斯模糊的示例

Opencv+Python实现图像运动模糊和高斯模糊的示例

今天小编就为大家分享一篇关于Opencv+Python实现图像运动模糊和高斯模糊的示例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

基于Python的LeNet-5卷积神经网络的实现(分类).zip

基于Python的LeNet-5卷积神经网络的实现(分类).zip

基于Python的LeNet-5卷积神经网络的实现(分类)

Python实现使用卷积提取图片轮廓功能示例

Python实现使用卷积提取图片轮廓功能示例

主要介绍了Python实现使用卷积提取图片轮廓功能,涉及Python数值运算与图像处理相关操作技巧,需要的朋友可以参考下

CNN卷积核特征提取[项目代码]

CNN卷积核特征提取[项目代码]

本文详细介绍了卷积神经网络(CNN)中卷积核如何通过卷积运算提取图像特征,并通过Python代码实现展示了具体的卷积运算过程。文章首先解释了卷积核在CNN中的核心作用,即通过滑动窗口方式在图像矩阵上进行卷积运算以生成特征图。随后提供了完整的Python代码示例,包括自定义卷积核、使用numpy进行图像卷积运算以及生成特征图的步骤。代码中实现了两种不同的卷积核(3x3边缘特征提取器和5x5浮雕特征提取器),并展示了实际卷积效果。最后通过实验结果表明,不同的卷积核能够有效提取图像的不同特征(如边缘特征和浮雕效果),帮助读者更直观地理解CNN在图像识别和目标检测等深度学习任务中的工作原理。

cifar反卷积、卷积核优化和多通道卷积的简洁代码

cifar反卷积、卷积核优化和多通道卷积的简洁代码

cifar反卷积、cifar卷积核优化、cifar多通道卷积、cifar简洁代码

使用卷积核提取图像特征举例(包含边缘特征提取和浮雕特征提取等).zip

使用卷积核提取图像特征举例(包含边缘特征提取和浮雕特征提取等).zip

这是 使用卷积核提取图像特征的举例(包含边缘特征提取和浮雕特征提取等)。具体的实现效果还不错,这个博客中已经有所展示。欢迎下载交流。资源中包含全部源代码以及注释,同时使用的所有图片在包含在内。

最新推荐最新推荐

recommend-type

在Pycharm terminal中字体大小设置的方法

如下所示: file->settings->Editor->General->Console里面的console commands history size 以上这篇在Pycharm terminal中字体大小设置的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持软件开发网。 您可能感兴趣的文章:PyCharm中代码字体大小调整方法Pycharm使用之设置代码字体大小和颜色主题的教程用Pycharm实现鼠标滚轮控制字体大小的方法pycharm 使用心得(二)设置字体大小Pycharm 字体大小调整设置的方法实现
recommend-type

PyCharm中代码字体大小调整方法

在本篇文章里小编给大家分享了关于PyCharm中代码字体大小调整方法以及相关知识点,需要的朋友们学习下。
recommend-type

PyCharm设置注释字体颜色以及是否倾斜的操作

如下所示: File–>Settings–>Editor–> Color Scheme–>Language Defaults–>Comments–>Line conmment Italic是是否倾斜。 Blod是否加粗。 Foreground是字体颜色。 Background背景色。 补充知识:Pycharm默认注释字体大小不一的解决方法 再使用Pycharm的过程中我们可能会发现注释的字体大小不一的情况; 注释中文字大小不一 因为个人习惯或是为了方便学习和工作我们会希望将其设置统一。以下为笔者使用过的方法。因为直接上手图片更加直观所以直接上图。 一、第一步 二、第二步 三、第三步
recommend-type

PyCharm更改字体和界面样式的方法步骤

主要介绍了PyCharm更改字体和界面样式的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
recommend-type

Pycharm 字体大小调整设置的方法实现

主要介绍了Pycharm 字体大小调整的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
recommend-type

学生成绩管理系统C++课程设计与实践

资源摘要信息:"学生成绩信息管理系统-C++(1).doc" 1. 系统需求分析与设计 在进行学生成绩信息管理系统开发前,首先需要进行系统需求分析,这是确定系统开发目标与范围的过程。需求分析应包括数据需求和功能需求两个方面。 - 数据需求分析: - 学生成绩信息:需要收集学生的姓名、学号、课程成绩等数据。 - 数据类型和长度:明确每个数据项的数据类型(如字符串、整型等)和长度,例如学号可能是字符串类型且长度为一定值。 - 描述:详细描述每个数据项的意义,以确保系统能够准确处理。 - 功能需求分析: - 列出功能列表:用户界面应提供清晰的操作指引,列出所有可用功能。 - 查询学生成绩:系统应能通过学号或姓名查询学生的成绩信息。 - 增加学生成绩信息:允许用户添加未保存的学生成绩信息。 - 删除学生成绩信息:能够通过学号或姓名删除已经保存的成绩信息。 - 修改学生成绩信息:通过学号或姓名修改已有的成绩记录。 - 退出程序:提供安全退出程序的选项,并确保所有修改都已保存。 2. 系统设计 系统设计阶段主要完成内存数据结构设计、数据文件设计、代码设计、输入输出设计、用户界面设计和处理过程设计。 - 内存数据结构设计: - 使用链表结构组织内存中的数据,便于动态增删查改操作。 - 数据文件设计: - 选择文本文件存储数据,便于查看和编辑。 - 代码设计: - 根据功能需求,编写相应的函数和模块。 - 输入输出设计: - 设计简洁明了的输入输出提示信息和操作流程。 - 用户界面设计: - 用户界面应为字符界面,方便在命令行环境下使用。 - 处理过程设计: - 设计数据处理流程,确保每个操作都有明确的处理逻辑。 3. 系统实现与测试 实现阶段需要根据设计阶段的成果编写程序代码,并进行系统测试。 - 程序编写: - 完成系统设计中所有功能的程序代码编写。 - 系统测试: - 设计测试用例,通过测试用例上机测试系统。 - 记录测试方法和测试结果,确保系统稳定可靠。 4. 设计报告撰写 最后,根据系统开发的各个阶段,撰写详细的设计报告。 - 系统描述:包括问题说明、数据需求和功能需求。 - 系统设计:详细记录内存数据结构设计、数据文件设计、代码设计、输入/输出设计、用户界面设计、处理过程设计。 - 系统测试:包括测试用例描述、测试方法和测试结果。 - 设计特点、不足、收获和体会:反思整个开发过程,总结经验和教训。 时间安排: - 第19周(7月12日至7月16日)完成项目。 - 7月9日8:00到计算机学院实验中心(三楼)提交程序和课程设计报告。 指导教师和系主任(或责任教师)需要在文档上签名确认。 系统需求分析: - 使用表格记录系统需求分析的结果,包括数据项、数据类型、数据长度和描述。 - 分析数据项如学生成绩信息、状态器、链表节点等,确定其属性和行为。 以上就是文档中提到的学生成绩信息管理系统开发的关键知识点。开发此类系统需要熟练掌握C++编程基础,了解面向对象的程序设计思想,以及熟悉文件操作和链表等数据结构的应用。此外,良好的软件开发流程意识、测试意识和文档撰写能力也是必不可少的。
recommend-type

别再手动拖拽了!用Lumerical脚本批量创建FDTD仿真结构(附完整代码)

# 告别低效建模:Lumerical脚本自动化实战指南 在光子学仿真领域,时间就是科研生命线。当同行还在GUI界面里反复点击菜单时,你已经用脚本批量生成了20组参数化结构——这不是未来场景,而是每位FDTD用户都应该掌握的基础生产力革命。本文将彻底改变你与Lumerical的交互方式,从手动拖拽的农耕时代,跃迁到自动化建模的工业文明。 ## 1. 为何脚本建模是必然选择 2019年Nature Photonics的一项研究显示,科研工作者在仿真工具上平均浪费37%的时间在重复性操作上。对于需要参数扫描的纳米光学结构设计,这个数字可能更高。手动创建10个不同尺寸的纳米柱阵列意味着: -
recommend-type

Java邮件解析任务中,如何安全高效地提取HTML邮件内容并避免硬编码、资源泄漏和类型转换异常?

<think>我们被要求优化一段Java代码,该代码用于处理邮件(特别是来自特定发件人的构建通知邮件)。代码的主要问题包括: 1. 重复获取邮件内容:在检查MIME类型后,多次调用`msg[i].getContent()`,这可能导致性能问题或流关闭异常。 2. 类型转换问题:直接将邮件内容转换为`Multipart`而不进行类型检查,可能引发`ClassCastException`。 3. 代码结构问题:逻辑嵌套过深,可读性差,且存在重复代码(如插入邮件详情的操作在两个地方都有)。 4. 硬编码和魔法值:例如在解析HTML表格时使用了硬编码的索引(如list3.get(10)),这容易因邮件
recommend-type

RH公司应收账款管理优化策略研究

资源摘要信息:"本文针对RH公司的应收账款管理问题进行了深入研究,并提出了改进策略。文章首先分析了应收账款在企业管理中的重要性,指出其对于提高企业竞争力、扩大销售和充分利用生产能力的作用。然后,以RH公司为例,探讨了公司应收账款管理的现状,并识别出合同管理、客户信用调查等方面的不足。在此基础上,文章提出了一系列改善措施,包括完善信用政策、改进业务流程、加强信用调查和提高账款回收力度。特别强调了建立专门的应收账款回收部门和流程的重要性,并建议在实际应用过程中进行持续优化。同时,文章也意识到企业面临复杂多变的内外部环境,因此提出的策略需要根据具体情况调整和优化。 针对财务管理领域的专业学生和从业者,本文提供了一个关于应收账款管理问题的案例研究,具有实际指导意义。文章还探讨了信用管理和征信体系在应收账款管理中的作用,强调了它们对于提升企业信用风险控制和市场竞争能力的重要性。通过对比国内外企业在应收账款管理上的差异,文章总结了适合中国企业实际环境的应收账款管理方法和策略。" 根据提供的文件内容,以下是详细的知识点: 1. 应收账款管理的重要性:应收账款作为企业的一项重要资产,其有效管理关系到企业的现金流、财务健康以及市场竞争力。不良的应收账款管理会导致资金链断裂、坏账损失增加等问题,严重影响企业的正常运营和长远发展。 2. 应收账款的信用风险:在信用交易日益频繁的商业环境中,企业必须对客户信用进行评估,以便采取合理的信用政策,降低信用风险。 3. 合同管理的薄弱环节:合同是应收账款管理的法律基础,严格的合同管理能够保障企业权益,减少因合同问题导致的应收账款风险。 4. 客户信用调查:了解客户的信用状况对于预测和控制应收账款风险至关重要。企业需要建立有效的客户信用调查机制,识别和筛选信用良好的客户。 5. 应收账款回收策略:企业应建立有效的账款回收机制,包括定期的账款跟进、逾期账款的催收等。同时,建立专门的应收账款回收部门可以提升回收效率。 6. 应收账款管理流程优化:通过改进企业内部管理流程,如简化审批流程、提高工作效率等措施,能够提升应收账款的管理效率。 7. 应收账款管理策略的调整和优化:由于企业的内外部环境复杂多变,因此制定的管理策略需要根据实际情况进行动态调整和持续优化。 8. 信用管理和征信体系的作用:建立和完善企业内部信用管理体系和征信体系,有助于企业更好地控制信用风险,并在市场竞争中占据有利地位。 9. 对比国内外应收账款管理实践:通过研究国内外企业在应收账款管理上的不同做法和经验,可以借鉴先进的管理理念和方法,提升国内企业的应收账款管理水平。 综上所述,本文深入探讨了应收账款管理的多个方面,为RH公司乃至其他同类型企业提供了应收账款管理的改进方向和策略,对于财务管理专业的教育和实践都具有重要的参考价值。
recommend-type

新手别慌!用BingPi-M2开发板带你5分钟搞懂Tina Linux SDK目录结构

# 新手别慌!用BingPi-M2开发板带你5分钟搞懂Tina Linux SDK目录结构 第一次拿到BingPi-M2开发板时,面对Tina Linux SDK里密密麻麻的文件夹,我完全不知道从哪下手。就像走进一个陌生的大仓库,每个货架上都堆满了工具和零件,却找不到操作手册。这种困惑持续了整整两天,直到我意识到——理解目录结构比死记硬背每个文件更重要。 ## 1. 为什么SDK目录结构如此重要 想象你正在组装一台复杂的模型飞机。如果所有零件都混在一个箱子里,你需要花大量时间寻找每个螺丝和面板。但如果有分门别类的隔层,标注着"机身部件"、"电子设备"、"紧固件",组装效率会成倍提升。Ti