我有一个Android应用程序,其中包含用户提供的图像。有很多用户向后端应用程序提交黑色或非常暗的图像,我想过滤掉。最佳解决方案是过滤手机上已有的图像,并通知用户更多光线并重新拍摄照片。如果更容易实现的另一个解决方案是在python中编写的后端过滤它。我看了一下opencv,但我真的不知道从哪里开始。有关在Android和/或python中获取信息以测量图像亮度/颜色的任何提示吗?
答案 0 :(得分:7)
您可以尝试使用图像的直方图作为第一个近似值。
使用PIL的示例,如果存在更多“暗”像素(灰度表示中的前128个值)而不是“浅”像素,则会提醒您:
import Image
img = Image.open('m.jpg')
gsimg = im.convert(mode='L')
hg = gsimg.histogram()
# count should be 256 most/all of the time (an index for each shade of grey)
count = len(hg)
if sum(hg[:count/2]) > sum(hg[count/2:]):
print "the image is too dark"
答案 1 :(得分:2)
我可能会考虑计算一些关于图像的简单统计数据。你真的不需要opencv来正确地做到这一点。我会考虑平均亮度和图像的变化。
这是一个做平均亮度的简单公式:
Formula to determine brightness of RGB color
加上一系列最小/最大值可以告诉您是否有大部分黑色图像。直方图也可能有用,但您可能不需要完整的直方图。这一切都可以通过手机在Java中轻松计算出来。
如果你想真正想要你可以进行统计数据计算,并告诉用户它不够亮。然后进行亮度调整以使图像标准化。这是一个非常简单的过程:
http://en.wikipedia.org/wiki/Normalization_(image_processing)
然后在其上运行图像统计,并查看它是否有助于调整图像,以便允许上传图像。
答案 2 :(得分:0)
在Python中,您可以使用PIL进行基本图像分析。
http://effbot.org/imagingbook/imagestat.htm
是ImageStat模块的文档。用法如:
from PIL import Image,ImageStat
im = Image.open("bride.jpg")
stat = ImageStat.Stat(im)
现在各种各样的'stat'会告诉你图像的红色,绿色和蓝色条带。对于暗图像,您希望它们较低,因此请检查stat.mean的值,如果它们低于某些截止值,则声明图像为暗。你必须自己制作一些样本图像,看看你得到了什么样的价值。
[编辑]
使用ImageOps.grayscale将图像转换为灰度可能更简单,然后只返回一个值用于统计。
答案 3 :(得分:0)
如何将图像转换为灰度图像,计算灰度图像的平均颜色,过滤掉图像而不是超过某个阈值?