【问题标题】:OpenCV Python: Normalize imageOpenCV Python:标准化图像
【发布时间】:2017-03-31 11:15:31
【问题描述】:

我是 OpenCV 的新手。我想做一些与规范化相关的预处理。我想将我的图像标准化为特定大小。以下代码的结果给了我一个黑色图像。有人能指出我到底做错了什么吗?我输入的图像是黑白图像

import cv2 as cv
import numpy as np

img = cv.imread(path)
normalizedImg = np.zeros((800, 800))
cv.normalize(img,  normalizedImg, 0, 255, cv.NORM_MINMAX)
cv.imshow('dst_rt', self.normalizedImg)
cv.waitKey(0)
cv.destroyAllWindows()

【问题讨论】:

  • 您的图像是否使用了 8 位以外的位深度?如果是这样,您需要将其转换为 8 位才能显示。
  • img.dtype 给了我 uint8 @zeFrenchy
  • 我希望你的意思是图像是灰度的,而不是真正的黑白,否则规范化将无济于事。它适用于 NORM_L2 吗?
  • 对不起,如果我的条款不正确。我的意思是我的图像是二值化的。像素值为 (0, 0, 0) 或 (255, 255, 255)。我不确定这是否是灰度的一部分;在课堂上,教授告诉我们灰度和二值化之间存在差异

标签: python opencv


【解决方案1】:

可以在http://docs.opencv.org/2.4/modules/core/doc/operations_on_arrays.html#cv2.normalize 看到,有一个→ dst 表示normalize 函数的结果作为输出参数返回。该函数不会就地更改输入参数dst。 (cv.imshow('dst_rt', self.normalizedImg) 行中的 self. 是错字)

import cv2 as cv
import numpy as np
path = r"C:\Users\Public\Pictures\Sample Pictures\Hydrangeas.jpg"
img = cv.imread(path)
normalizedImg = np.zeros((800, 800))
normalizedImg = cv.normalize(img,  normalizedImg, 0, 255, cv.NORM_MINMAX)
cv.imshow('dst_rt', normalizedImg)
cv.waitKey(0)
cv.destroyAllWindows()

【讨论】:

  • 如何标准化所有图像集?您应该单独考虑每张图像还是对所有图像进行归一化?
  • 这取决于“alpha”和/或“beta”是变量还是固定值。如果它们是变量(例如图像集值的所有最小值和最大值) - 所有图像(但您需要提前计算 alpha 和 beta)。如果它们是固定的 - 每个图像本身。
  • 如果cv2.normalize返回dst作为输出参数,为什么dst也作为输入参数呢? @OphirCarmi
  • 这是个好问题,可能是因为这个函数的c++ api
【解决方案2】:

它给你一个黑色的图像,因为你可能在 img 和 normalizedImg 中使用了不同的尺寸。

import cv2 as cv

img = cv.imread(path)
img = cv.resize(img, (800, 800))
cv.normalize(img, img, 0, 255, cv.NORM_MINMAX)

cv.imshow('dst_rt', img)
cv.waitKey(0)
cv.destroyAllWindows()

更新:在 NumPy 中有更直观的方法可以做到这一点ref

a = np.random.rand(3,2)

# Normalised [0,1]
b = (a - np.min(a))/np.ptp(a)

# Normalised [0,255] as integer: don't forget the parenthesis before astype(int)
c = (255*(a - np.min(a))/np.ptp(a)).astype(int)        

# Normalised [-1,1]
d = 2.*(a - np.min(a))/np.ptp(a)-1

【讨论】:

    【解决方案3】:

    当您调用cv.imshow() 时,您使用self.normalizedImg,而不是normalizedImg

    自我。用于标识类成员,并且在您编写的代码中使用它是不合适的。它甚至不应该像写的那样运行。不过我假设这段代码是从类定义中提取的,但你必须在命名变量时保持一致,self.normalizedImgnormalizedImg 不同。

    【讨论】:

      猜你喜欢
      • 2016-10-27
      • 1970-01-01
      • 2017-07-05
      • 2019-12-11
      • 2022-01-12
      • 1970-01-01
      • 1970-01-01
      • 2019-11-24
      • 2014-06-03
      相关资源
      最近更新 更多