如何在OpenCV中为单图添加双滤镜及实现半灰度半Sobel效果
在OpenCV中应用多滤镜及生成半灰度半Sobel效果的方法
嘿,这两个问题都是OpenCV里很实用的基础操作,我来一步步给你拆解清楚:
1. 给同一张图像应用两种滤镜
这里分两种常见场景,你可以根据需求选择:
场景1:顺序叠加多种滤镜
这是最常用的方式——先对图像做一种滤镜处理,再把处理后的结果作为输入,应用第二种滤镜。比如先做高斯模糊降噪,再用Canny检测边缘:
import cv2 import numpy as np # 读取图像 img = cv2.imread('your_image.jpg') # 第一步:应用高斯模糊滤镜 blurred_img = cv2.GaussianBlur(img, (5,5), 0) # 第二步:对模糊后的图像应用Canny边缘检测滤镜 final_img = cv2.Canny(blurred_img, 50, 150) # 显示结果 cv2.imshow('Original', img) cv2.imshow('Filtered Result', final_img) cv2.waitKey(0) cv2.destroyAllWindows()
场景2:同时应用两种滤镜并合并效果
如果你想让两种滤镜的效果同时体现在最终图像上(比如模糊+锐化的混合),可以分别生成两种滤镜的结果,再用加权融合的方式合并:
import cv2 import numpy as np img = cv2.imread('your_image.jpg') # 生成两种滤镜效果 blurred = cv2.GaussianBlur(img, (7,7), 2) sharpened = cv2.filter2D(img, -1, np.array([[-1,-1,-1], [-1,9,-1], [-1,-1,-1]])) # 加权合并两种效果(权重可以自己调整) merged_img = cv2.addWeighted(blurred, 0.3, sharpened, 0.7, 0) cv2.imshow('Merged Filter Effect', merged_img) cv2.waitKey(0) cv2.destroyAllWindows()
2. 生成半灰度半Sobel效果的图像
要实现这种分区域的效果,核心思路是分割图像区域,分别处理后再拼接。下面是具体的代码实现(以左右分割为例):
import cv2 import numpy as np # 读取图像,注意保留彩色通道 img = cv2.imread('your_image.jpg') height, width = img.shape[:2] split_line = width // 2 # 中间分割线 # 处理左半部分:转灰度后转回3通道(方便和彩色Sobel部分拼接) left_gray = cv2.cvtColor(img[:, :split_line], cv2.COLOR_BGR2GRAY) left_gray_3ch = cv2.cvtColor(left_gray, cv2.COLOR_GRAY2BGR) # 处理右半部分:应用Sobel算子 right_part = img[:, split_line:] right_gray = cv2.cvtColor(right_part, cv2.COLOR_BGR2GRAY) # Sobel X方向边缘检测 sobel_x = cv2.Sobel(right_gray, cv2.CV_64F, 1, 0, ksize=3) # 转换为uint8类型并转回3通道 sobel_x_uint8 = cv2.convertScaleAbs(sobel_x) right_sobel_3ch = cv2.cvtColor(sobel_x_uint8, cv2.COLOR_GRAY2BGR) # 拼接左右两部分 final_img = np.hstack((left_gray_3ch, right_sobel_3ch)) # 显示结果 cv2.imshow('Half Gray Half Sobel', final_img) cv2.waitKey(0) cv2.destroyAllWindows()
如果想要上下分割,只需要把img[:, :split_line]换成img[:split_line, :],img[:, split_line:]换成img[split_line:, :]就可以啦。
内容的提问来源于stack exchange,提问作者Jess Brown




