我想加载彩色图像,将其转换为灰度图像,然后反转文件中的数据。
我需要什么:在OpenCV中迭代数组,并使用以下公式更改每个值(这可能是错误的,但对我来说似乎是合理的):
img[x,y] = abs(img[x,y] - 255)
但我不明白为什么不管用
def inverte(imagem, name):
imagem = abs(imagem - 255)
cv2.imwrite(name, imagem)
def inverte2(imagem, name):
for x in np.nditer(imagem, op_flags=['readwrite']):
x = abs(x - 255)
cv2.imwrite(name, imagem)
if __name__ == '__main__':
nome = str(sys.argv[1])
image = cv2.imread(nome)
gs_imagem = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
inverte(gs_imagem, "invertida.png")
inverte2(gs_imagem, "invertida2.png")
我不想做一个显式的循环(我想更像Python),我可以看到一个白色背景的图像变成了黑色,但只有这个看起来不像其他颜色有太多的变化(如果有的话)。
7条答案
按热度按时间shyt4zoc1#
你差点就成功了,你被
abs(imagem-255)
的错误结果所欺骗,因为你的dtype
是一个无符号整数,你必须执行(255-imagem)
以保持整数无符号:您也可以使用OpenCV的
bitwise_not
函数反转图像:2ul0zpep2#
或者,您可以使用OpenCV的
bitwise_not
函数反转图像:我喜欢this的例子。
pvabu6sv3#
您可以使用“波浪号”操作符来完成此操作:
这是因为“波浪号”运算符(也称为一元运算符)根据对象类型执行补码操作
例如,对于整数,其公式为:
x +(~x)= -1
但在本例中,opencv对其图像使用“uint 8 numpy数组对象”,因此其范围为0到255
因此,如果我们将此操作符应用于“uint 8 numpy数组对象”,如下所示:
我们的结果是:
因为它的公式是
x2 = 255 - x1
而这正是我们想要解决问题的方法。
j1dl9f464#
你也可以和numpy一起做。
7tofc5zh5#
在Python/OpenCV中,我认为您需要:
fykwrbwg6#
为什么不在
numpy
中使用 * 问题的第一行 *?就这么简单。不需要迭代或任何其他函数。
numpy
会自动为我们完成:)dced5bon7#