通常我们将读入的彩色图转化成灰度图,需要将灰度图反转得到掩码,如何正确快速的得到某个图像的反转图呢?
首先看一种看似很正确的写法,对其中每个像素进行如下处理:
img[x,y] = abs(img[x,y] - 255)
其实,灰度图中像素值是<class numpy.uint8>, 即8位无符号数,这是为了保证像素值0~255。
所以正确的写法只需 img = 255-img。
def inverte(imagem, name): imagem = (255-imagem) cv2.imwrite(name, imagem)
或者使用OpenCV中的库函数
imagem = cv2.bitwise_not(imagem)
还有一种简洁的方法,但是不那么直观。
import cv2 image = cv2.imread("img.png") image = ~image cv2.imwrite("img_inv.png",image)
为什么这是正确的呢?前面知数据类型为8位无符号数,已知 $x+(sim x)+1=0$,所以$255-x=255+(sim x)+1=(sim x)+256= sim x$.
import numpy as np x1 = np.array([25,255,10], np.uint8) #for example x2 = ~x1 print(x1) print (x2)
结果为:
[ 25 255 10]
[230 0 245]
参考链接:stack overflow中inverting image in Python with OpenCV https://stackoverflow.com/questions/19580102/inverting-image-in-python-with-opencv