如何使用OpenCV检测图像是否被应用了颜色滤镜?
如何用OpenCV检测图像是否被添加颜色滤镜
当然可以用OpenCV检测,给你两个适合新手的简单方法:
方法1:对比RGB通道的亮度均值
OpenCV读取图像默认是BGR格式,拆分后能拿到蓝、绿、红三个通道的像素数据。像你提供的红色滤镜图像,红通道的整体亮度会远高于绿、蓝通道,正常图像的三个通道均值会相对均衡。
代码示例:
import cv2 import numpy as np # 替换成你的图像路径 img = cv2.imread("your_image.jpg") # 拆分BGR三个通道 b_channel, g_channel, r_channel = cv2.split(img) # 计算每个通道的平均亮度 avg_blue = np.mean(b_channel) avg_green = np.mean(g_channel) avg_red = np.mean(r_channel) # 设定阈值判断(这里1.5可以根据实际情况调整) if avg_red > avg_green * 1.5 and avg_red > avg_blue * 1.5: print("图像大概率应用了红色滤镜") else: print("图像无明显红色滤镜特征")
方法2:用HSV颜色空间检测特定颜色占比
HSV空间对颜色的区分更直观,红色对应的色相(H通道)范围是0-10和170-180。统计图像中属于红色区间的像素占比,就能判断是否加了红色滤镜。
代码示例:
import cv2 import numpy as np img = cv2.imread("your_image.jpg") # 把BGR转成HSV格式 hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # 定义红色的HSV范围(饱和度和明度可以根据情况微调) lower_red1 = np.array([0, 50, 50]) upper_red1 = np.array([10, 255, 255]) lower_red2 = np.array([170, 50, 50]) upper_red2 = np.array([180, 255, 255]) # 生成红色区域的掩码 mask_red1 = cv2.inRange(hsv_img, lower_red1, upper_red1) mask_red2 = cv2.inRange(hsv_img, lower_red2, upper_red2) total_red_mask = mask_red1 + mask_red2 # 计算红色像素占总像素的比例 red_ratio = np.sum(total_red_mask > 0) / (img.shape[0] * img.shape[1]) # 比如占比超过30%就判定有红色滤镜 if red_ratio > 0.3: print("图像大概率应用了红色滤镜") else: print("图像无明显红色滤镜特征")
小提示
- 如果图像本身红色元素很多,建议找同场景的正常图像做对比,看通道均值或颜色占比的差异。
- 要是遇到复杂的多颜色滤镜,可能需要对比图像的直方图(正常图像和滤镜图像的直方图形状会有明显差异)。
内容的提问来源于stack exchange,提问作者Minh Ngo
相关产品推荐
相关产品推荐

