一、遍历图片像素
import cv2 as cv
#函数——遍历像素取反后显示图片
def access_pixels(image):
width = image.shape[0]
height = image.shape[1]
channels = image.shape[2]
print("width = %s,height = %s,channels = %s"%(width,height,channels))
for iin range(width):
for jin range(height):
for kin range(channels):
pv = image[i,j,k]
image[i,j,k]=255-pv
cv.imshow("pixels_b",image)
#载入并显示图片
img = cv.imread("D:/temp/img/f1.jpg")
cv.imshow("Image",img)
#调用函数
access_pixels(img)
#等待键盘输入并关闭所有窗口
cv.waitKey(0)
cv.destroyAllWindows()
二、创建一张新图,使用通道及像素简单控制其色彩
1、创建一张3通道新图
import cv2 as cv
import numpy as np
pic = np.zeros([666,666,3],np.uint8) #创建一个3通道,第一个参数是形状,第二个是类型
pic[:,:,2] = np.ones([666,666])*255 #通过控制通道和像素值确定呈现的色彩
cv.imshow("new_pic",pic)
cv.waitKey(0)
cv.destroyAllWindows()
2、创建一张单通道新图
import cv2 as cv
import numpy as np
pic = np.zeros([666,666,1],np.uint8)
pic[:, :, 0] = np.ones([666, 666]) *127 #单通道127对应灰色
cv.imshow("new_pic",pic)
cv.waitKey(0)
cv.destroyAllWindows()
三、知识点整理
1、zeros和ones
np.zeros(size,dtype) 可以创建任意维度的数组,新建图片内所有像素值均为0
np.ones(size,dtype) 可以创建任意维度的数组,新建图片内所有像素值均为1
以下代码:
pic = np.zeros([666,666,1],np.uint8)
pic[:, :, 0] = np.ones([666, 666]) *127
可以单使用ones代替为:
pic = np.ones([666, 666, 1],np.uint8)*127
2、Numpy数组的基本操作
m1 = np.ones([3,3],np.float32) #新建一个3行3列的数组,数据类型为float32
m1.fill(12222.38) #m1数组中所有值都赋值为12222.38
print(m1)
m2 = m1.reshape([1,9]) #把m1变为1行9列的数组m2
3、计算函数执行时间
在本文一中加入以下代码,可计算函数执行所需时间:
t1 = cv.getTickCount()
access_pixels(src)#需要测试时间的函数
t2 = cv.getTickCount()
time = (t2-t1)/cv.getTickFrequency()5print("time : %s ms"%(time*1000))
4、python中像素取反的基本操作
本文一中像素取反的函数效率低,实际编程中直接调用python中已有的API可极大提升效率。
access_pixels(image)函数可改为以下函数:
def inverse(image):
des = cv.bitwise_not(image)
cv.imshow("inverse demo",des)