You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何在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

火山引擎 最新活动