opencv对图片每个像素操作

1.遍历图像对其每个像素取反

import cv2 as cv
import numpy as np

img = cv.imread("d:/girl.jfif")
cv.imshow("img", img)

height = img.shape[0]
width = img.shape[1]
channels = img.shape[2]
t1 = cv.getTickCount()
for h in range(height):
    for w in range(width):
        for c in range(channels):
            img[h, w, c] = 255 - img[h, w, c]
t2 = cv.getTickCount()
t = (t2 - t1)/cv.getTickFrequency()*1000
print("%f ms"%t)
cv.imshow("img2", img)
cv.waitKey(0)

注意cv.getTickCount()的使用可以获得程序运行时间。

t = (t2 - t1)/cv.getTickFrequency()*1000

其中t的单位是毫秒

 顺便一提,可以使用cv.bitwise_not(image)来实现对图像取反,比上面的代码要快几千倍。事实上,还有bitwise_and, bitwise_or, bitwise_xor等位操作的函数

2.构造一张蓝色的图

'''
构造一张蓝色的图
'''
import cv2 as cv
import numpy as np

img = np.zeros(shape=[400, 400, 3], dtype=np.uint8)
img[:,:,0] = np.ones([400, 400])*255
cv.imshow("img", img)
cv.waitKey(0)

三通道,bgr,所以只需要对第三维的索引0赋值。

3.构造单通道灰度图

'''
构造一张灰色的图
'''
import cv2 as cv
import numpy as np

img = np.ones(shape=[400, 400, 1], dtype=np.uint8)
height = img.shape[0]
width = img.shape[1]
channels = img.shape[2]
for h in range(height):
    for w in range(width):
        for c in range(channels):
            img[h, w, c] = (h+w)%255
cv.imshow("img", img)
cv.waitKey(0)

结果很漂亮惹,懒得截图了

原文地址:https://www.cnblogs.com/loubin/p/12271412.html