【问题标题】:Find If Image Is Bright Or Dark查找图像是亮还是暗
【发布时间】:2018-09-25 20:05:15
【问题描述】:

我想知道如何使用 OpenCV 在 Python 3 中编写一个函数,该函数接受图像和阈值,并在严重模糊和降低质量(越快越好)后返回“暗”或“亮”。这听起来可能含糊不清,但任何可行的方法都可以。

【问题讨论】:

  • 到目前为止你尝试了什么?
  • 为什么不直接在终端中输入 ImageMagick 1-liner,以百分比形式告诉您图像的平均强度 convert image.jpg -format "%[fx:int(mean*100)]" info:
  • 不知道为什么你觉得你需要模糊?
  • 为什么不简单地使用基于直方图的方法?
  • 你可以直接在终端使用libvipsvips avg someImage.png

标签: python opencv image-processing opencv-python


【解决方案1】:

你可以试试这个,考虑到image 是灰度图像 -

blur = cv2.blur(image, (5, 5))  # With kernel size depending upon image size
if cv2.mean(blur) > 127:  # The range for a pixel's value in grayscale is (0-255), 127 lies midway
    return 'light' # (127 - 255) denotes light image
else:
    return 'dark' # (0 - 127) denotes dark image

参考这些 -
Smoothing, Mean, Thresholding

【讨论】:

  • 模糊前后的平均值应该相同(如果使用适当的边界条件)。
  • 重要的是要注意 127 大约是 255 的一半,以及所有内容。请评论您的代码。
  • @CrisLuengo 这对于 blur() 是正确的,但其他模糊技术会改变 mean()。
【解决方案2】:

就个人而言,我不会为这样一个简单的操作编写任何 Python 或加载 OpenCV。如果您绝对必须使用 Python,请忽略此答案并选择其他答案。

您可以在终端的命令行中使用 ImageMagick 以百分比形式获取图像的平均亮度,其中 100 表示 “全白” 和0 表示“全黑”,像这样:

convert someImage.jpg -format "%[fx:int(mean*100)]" info:

或者,您可以使用libvips,它不太常见,但非常快速且非常轻量级:

vips avg someImage.png

vips 答案的比例为 0..255,适用于 8 位图像。

请注意,这两种方法都适用于多种图像类型,从 PNG、GIF、JPEG 和 TIFF。

【讨论】:

    【解决方案3】:

    你可以试试这个:

    import imageio
    import numpy as np
    
    f = imageio.imread(filename, as_gray=True)
    
    def img_estim(img, thrshld):
        is_light = np.mean(img) > thrshld
        return 'light' if is_light else 'dark'
    
    print(img_estim(f, 127))
    

    【讨论】:

    • numpy 导入语句丢失。无论如何都很好用。 +1
    • 甚至认为该解决方案有效,但我无法区分明暗图像。因为差别很小。例如,暗图像有时是 136,而亮图像有时也是 136。需要一种比亮图像更智能的方法来计算灰度
    猜你喜欢
    • 2011-08-16
    • 2011-01-31
    • 2013-04-22
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    • 2010-12-17
    相关资源
    最近更新 更多