python - 如何确定图像的亮度/饱和度是否更高/更低?
问题描述
我使用 Python,我有一个数据集,其中有一些图像,练习中说的是这样的:
- 如果图像亮度较高而饱和度较低 -> 图像 1 的 Lind
- 如果图像亮度较低而饱和度较高 -> 图像类型 2
现在,如何确定图像的亮度/饱和度是否更高/更低?
解决方案
一个简单的想法是计算HSV 颜色空间中的饱和度和值(亮度)通道的平均值。然后,只需为这两个值设置一些阈值来区分这两个类。
这是具有高亮度和低饱和度的 Lenna:
这是低亮度和高饱和度的Lenna:
使用OpenCV完成上述任务的一些代码片段:
import cv2
# Read images
img_hv_ls = cv2.imread('Lenna_high_brightness_low_saturation.png')
img_lv_hs = cv2.imread('Lenna_low_brightness_high_saturation.png')
# Calculate means in HSV color space
mean_hv_ls = cv2.mean(cv2.cvtColor(img_hv_ls, cv2.COLOR_BGR2HSV))
mean_lv_hs = cv2.mean(cv2.cvtColor(img_lv_hs, cv2.COLOR_BGR2HSV))
# Put information on images
font = cv2.FONT_HERSHEY_DUPLEX
cv2.putText(img_hv_ls, 'Mean brightness: ' + '{:.4f}'.format(mean_hv_ls[2]/255), (10, 30), font, 1, (0, 0, 0), 1)
cv2.putText(img_hv_ls, 'Mean saturation: ' + '{:.4f}'.format(mean_hv_ls[1]/255), (10, 60), font, 1, (0, 0, 0), 1)
cv2.putText(img_lv_hs, 'Mean brightness: ' + '{:.4f}'.format(mean_lv_hs[2]/255), (10, 30), font, 1, (255, 255, 255), 1)
cv2.putText(img_lv_hs, 'Mean saturation: ' + '{:.4f}'.format(mean_lv_hs[1]/255), (10, 60), font, 1, (255, 255, 255), 1)
cv2.imshow('High brightness, low saturation', img_hv_ls)
cv2.imshow('Low brightness, high saturation', img_lv_hs)
cv2.waitKey(0)
cv2.destroyAllWindows()
而且,这将是输出:
现在,检查图像的代表性(子)集,并根据实际图像分类的饱和度和亮度均值推断出适当的阈值。
希望有帮助!
推荐阅读
- android - gradle 版本 3.2.1 破坏了 Lambdas
- sql - SQL - 在 SQL 中使用 Comparator 获取不同 SQL 值的公共数据
- python - 如何添加从现有日期列和条件列计算的数据框日期列?
- javascript - 使用 Campground.findById(req.params.id, function(err, foundCampground) 时出现强制转换异常,我不知道为什么
- javascript - 如果显示元素 > 隐藏它下面的所有元素(纯 JS)
- neo4j - Neo4j 如何返回每个属性值的顶部节点
- sql - Select语句中的计数查询
- python - 找到两点之间的最短路径
- powerbi - 计算列从 PowerBI 中另一个表中的值获取平均值
- python - Numpy:如何迭代地将 3D 数组堆叠成行?