【问题标题】:How to get luminance gradient of an image如何获得图像的亮度梯度
【发布时间】:2020-04-04 09:58:40
【问题描述】:

我正在努力通过图像亮度检查来理解图像,我试图通过下面的代码找到图像的亮度

def brightness( im_file ):
   im = Image.open(im_file)
   stat = ImageStat.Stat(im)
   r,g,b = stat.rms
   return math.sqrt(0.241*(r**2) + 0.691*(g**2) + 0.068*(b**2))

想了解如何获得整个图像来计算每个像素或一组像素的亮度,类似于在photo-forensics - Luminance Gradient 实现的内容


执行错误

import cv2
import numpy as np

im = cv2.imread('image.jpeg')  
lum = cv2.imread('image.jpeg',cv2.IMREAD_GRAYSCALE)

gradX = cv2.Sobel(lum,cv2.CV_64F,1,0,ksize=5)
gradY = cv2.Sobel(lum,cv2.CV_64F,0,1,ksize=5)

grad  = np.sqrt(gradX**2 + gradY**2)

fraction = 0.3
mixed = cv2.addWeighted(im, fraction, grad, 1.0-fraction,0)

cv2.error: OpenCV(3.4.2) /io/opencv/modules/core/src/arithm.cpp:659: error: (-209:Sizes of input arguments do not match) 操作既不是'array op array'(其中数组具有相同的大小和相同的通道数),也不是'array op scalar',也不是函数'arithm_op'中的'scalar op array'

【问题讨论】:

  • 图像 -> 2d numpy 数组 -> numpy.gradient 或 numpy.diff

标签: python image image-processing luminance


【解决方案1】:

如果没有您的进一步描述/澄清,我假设您想要图像亮度的渐变。所以,首先我们需要亮度图像,然后是梯度。请注意,下面的示例代码根本没有经过测试,它只是给出了如何进行的大致思路。

亮度只是灰度图像的同义词,因此根据您选择的库,您可以这样做:

from PIL import Image
lum = Image.open('image.png').convert('L')            # PIL method

或者:

import cv2
lum = cv2.imread('image.png',cv2.IMREAD_GRAYSCALE)    # OpenCV method

您也可以转换为 HSV 并采用第三个渠道:

im = Image.open(f).convert('HSV')                     # PIL method
H, S, lum = im.split()

或者:

im = cv2.imread('image.png')                          # OpenCV method
lum = cv2.cvtColor(im, cv2.COLOR_BGR2HSV)[...,2]

现在你想要它的梯度,所以它可能是 Sobel 或 Scharr:

# Calculate gradient in x-direction
gradX = cv2.Sobel(... 0,1, ...)
# And y-direction
gradY = cv2.Sobel(... 1,0, ...)
# And get combined gradient
grad  = np.sqrt(gradX**2 + gradY**2)

看起来您链接到的网站将其与原始网站混合在一起,我猜这可以通过以下方式完成:

fraction = 0.3
mixed = cv2.AddWeighted(im, fraction, grad, 1.0-fraction, ...)

【讨论】:

  • 不是在合适的计算机上,但im 是3 通道uint8grad 是1 通道float,所以你可能想将im 提升为float并将 grad 堆叠到 3 通道,类似于 mixed = cv2.addWeighted(im.astype(np.float64), fraction, np.dstack((grad,grad,grad)), 1.0-fraction,0)
  • 嗨,我对@Mark Setchell 的回答有疑问。每当我使用PIL 时,转换返回的仍然是一个对象(即PIL.Image.Image)。如何从中获得图像的亮度?更准确地说,我相信lum 不是亮度而是图像的亮度。那么如何获得亮度呢?
  • 请以正常方式提出问题,提出问题,而不是将新问题标记到相对较少人会看到的旧答案上。谢谢你。这样你会得到更好的答案。
猜你喜欢
  • 2018-10-27
  • 2021-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-20
  • 1970-01-01
  • 2012-02-03
  • 2014-04-02
相关资源
最近更新 更多