图像的卷积操作

卷积操作是一种线性滤波技术,通过在图像上滑动一个卷积核(滤波器)来提取图像特征。每个输出像素是卷积核与对应图像区域像素的加权和。

卷积操作步骤:

  1. 滑动卷积核:在图像上逐像素移动卷积核

  2. 对应相乘:卷积核权重与图像对应像素值相乘

  3. 求和:将所有乘积相加得到输出像素值

  4. 边缘处理:通常需要对图像边缘进行填充(如补0)

  5. 见卷积核类型:

  6. 边缘检测:Sobel, Laplacian, Prewitt

  7. 模糊/平滑:平均模糊,高斯模糊

  8. 锐化:增强边缘对比度

  9. 浮雕:创建3D效果

    python 复制代码
    # ====================
    # 1. 基础卷积实现
    # ====================
    
    def conv2d(image, kernel, padding=0, stride=1):
    	"""
    	2D卷积实现
    	:param image: 输入图像(2D数组)
    	:param kernel: 卷积核(2D数组)
    	:param padding: 边缘填充大小
    	:param stride: 步长
    	:return: 卷积结果
    	"""
    	# 添加padding
    	if padding > 0:
    		image = np.pad(image, padding, mode='constant')
    
    	# 获取尺寸
    	img_h, img_w = image.shape
    	kernel_h, kernel_w = kernel.shape
    
    	# 计算输出尺寸
    	output_h = (img_h - kernel_h) // stride + 1
    	output_w = (img_w - kernel_w) // stride + 1
    
    	# 初始化输出
    	output = np.zeros((output_h, output_w))
    
    	# 卷积计算
    	for y in range(0, output_h):
    		for x in range(0, output_w):
    			# 计算当前区域
    			y_start = y * stride
    			y_end = y_start + kernel_h
    			x_start = x * stride
    			x_end = x_start + kernel_w
    
    			# 提取图像区域
    			region = image[y_start:y_end, x_start:x_end]
    
    			# 卷积计算
    			output[y, x] = np.sum(region * kernel)
    
    	return output
    
    
    # ====================
    # 2. 常见卷积核示例
    # ====================
    
    # 定义常用卷积核
    kernels = {
    	# 边缘检测
    	'sobel_x': np.array([[-1, 0, 1],
    	                     [-2, 0, 2],
    	                     [-1, 0, 1]]),
    
    	'sobel_y': np.array([[-1, -2, -1],
    	                     [0, 0, 0],
    	                     [1, 2, 1]]),
    
    	'laplacian': np.array([[0, 1, 0],
    	                       [1, -4, 1],
    	                       [0, 1, 0]]),
    
    	# 模糊/平滑
    	'box_blur': np.ones((3, 3)) / 9,
    
    	'gaussian_blur': np.array([[1, 2, 1],
    	                           [2, 4, 2],
    	                           [1, 2, 1]]) / 16,
    
    	# 锐化
    	'sharpen': np.array([[0, -1, 0],
    	                     [-1, 5, -1],
    	                     [0, -1, 0]])
    }
    # ====================
    	# 6. 多通道图像卷积
    	# ====================
    
    	    def conv2d_multi_channel(image, kernel):
    		"""
    		多通道图像卷积(简化版)
    		image: (H, W, C) 或 (C, H, W)
    		kernel: (C_out, C_in, H, W) 或单个2D卷积核应用于所有通道
    		"""
    		if len(image.shape) == 2:
    			return conv2d(image, kernel)
    
    		if len(image.shape) == 3:
    			# 假设是 (H, W, C)
    			h, w, c = image.shape
    			output = np.zeros((h - 2, w - 2, c))
    
    			for channel in range(c):
    				output[:, :, channel] = conv2d(image[:, :, channel], kernel)
    
    			return output
    
    def visualize_convolution():
    	"""
    	可视化卷积过程
    	"""
    	try:
    		# 创建示例图像
    		# 读取图像
    		image = cv2.imread('D:\\photo\\lena.tif',0)
    		# rgb_image = cv2.imread('D:\\photo\\lena.tif')
    		# print(image)
    		# image = np.zeros((10, 10))
    		# image[2:8, 2:8] = 1  # 白色方块
    
    		# 创建卷积核
    		# kernel = np.array([[1, 0, -1],
    		#                    [2, 0, -2],
    		#                    [1, 0, -1]])
    		kernel = kernels['sharpen']
    		# 对每个通道应用相同卷积核
    		# result = conv2d_multi_channel(rgb_image, kernels['gaussian_blur'])
    		print(kernel)
    
    		# 卷积计算
    		result = conv2d(image, kernel, padding=1)
    		# print(result)
    
    		# 可视化
    		fig, axes = plt.subplots(1, 3, figsize=(12, 4))
    
    		axes[0].imshow(image, cmap='gray')
    		axes[0].set_title('原始图像')
    		axes[0].axis('off')
    
    		axes[1].imshow(kernel, cmap='gray', interpolation='nearest')
    		axes[1].set_title('卷积核 (Sobel X)')
    		axes[1].axis('off')
    
    		axes[2].imshow(result, cmap='gray')
    		axes[2].set_title('卷积结果')
    		axes[2].axis('off')
    
    		plt.tight_layout()
    		plt.show()
    
    	except Exception as e:
    		print(f"可视化需要matplotlib库: {e}")
    
    if __name__ == "__main__":
    
    # 可以选择运行可视化
        visualize_convolution()

    运行其中一个边缘滤波器结果如下:

相关推荐
云卓SKYDROID2 小时前
无人机航线辅助模块技术解析
人工智能·无人机·高科技·云卓科技
琅琊榜首20203 小时前
AI生成脑洞付费短篇小说:从灵感触发到内容落地
大数据·人工智能
imbackneverdie3 小时前
近年来,我一直在用的科研工具
人工智能·自然语言处理·aigc·论文·ai写作·学术·ai工具
roman_日积跬步-终至千里3 小时前
【计算机视觉-作业1】从图像到向量:kNN数据预处理完整流程
人工智能·计算机视觉
春日见4 小时前
自动驾驶规划控制决策知识点扫盲
linux·运维·服务器·人工智能·机器学习·自动驾驶
人工智能AI技术4 小时前
【Agent从入门到实践】43 接口封装:将Agent封装为API服务,供其他系统调用
人工智能·python
hjs_deeplearning4 小时前
文献阅读篇#14:自动驾驶中的基础模型:场景生成与场景分析综述(5)
人工智能·机器学习·自动驾驶
nju_spy4 小时前
离线强化学习(一)BCQ 批量限制 Q-learning
人工智能·强化学习·cvae·离线强化学习·双 q 学习·bcq·外推泛化误差