读取
def access_pixels(image):
print(image.shape)
height = image.shape[0]
width = image.shape[1]
channel = image.shape[2]
print('height : %s, width : %s, num_channels : %s' % (height, width, channel))
return 0
img_path = os.path.join(os.getcwd(), 'yao.jpg')
images = cv2.imread(filename=img_path) # channel = BGR
access_pixels(images)
cv2.namedWindow('input image', cv2.WINDOW_AUTOSIZE)
cv2.imshow('input image', images)
cv2.waitKey(600)
cv2.destroyAllWindows()
对逐个像素进行变换
def access_pixels(image):
print(image.shape)
height = image.shape[0]
width = image.shape[1]
channel = image.shape[2]
print('height : %s, width : %s, num_channels : %s' % (height, width, channel))
for row in range(height):
for column in range(width):
for c in range(channel):
pv = image[row, column, c] # pv的值就是读进来的矩阵的值
image[row, column, c] = 255 - pv # 255-pv的每个像素值
cv2.namedWindow('trans_img', cv2.WINDOW_AUTOSIZE)
cv2.imshow('trans_img', image)
return 0
img_path = os.path.join(os.getcwd(), 'yao.jpg')
my_image = cv2.imread(filename=img_path) # channel = BGR
access_pixels(my_image)
cv2.namedWindow('input image', cv2.WINDOW_AUTOSIZE)
cv2.imshow('input image', my_image)
# 调这个trans的函数
access_pixels(my_image)
cv2.waitKey()
cv2.destroyAllWindows()
处理时间的计算
access_pixels(my_image)
t1 = cv2.getCPUTickCount()
cv2.waitKey()
t2 = cv2.getCPUTickCount()
# # 一共计数多少次, 去除以每一秒钟计数多少次,就得到中间过去了多少秒( 2437500.0 )
t_sum = (t2-t1) / cv2.getTickFrequency()
print('time to calculate is %s ms' % (t_sum * 1000)) # *1000成为毫秒
输出结果:
time to calculate is 12.741874461538462 ms,也就是说我们花费了12毫秒来计算这个矩阵的trans
(768, 1280, 3) 加在一起 有 295W 个像素点
每个像素点是 8bit 的
创建一些新的图像(使用ndarray)
使用这种方法创建出来的就是纯色的图像了。
【有个问题】
[:, :, 0] 的这种方法是给某个channel中全部的像素赋值,那如果只是想赋值给部分的元素呢?
def create_image():
img = np.zeros([400, 400, 3], dtype=np.uint8)
cv2.namedWindow('create_img', cv2.WINDOW_AUTOSIZE)
# 修改某一个通道的值
# 注意这里 * 255 的这种赋值的方法
img[:, :, 0] = np.ones([400, 400]) * 255
cv2.imshow('create_img', img)
'''
# channel = 1 de gray image
img = np.zeros([400, 400], dtype=np.uint8)
img[:, :] = np.ones([400, 400]) * 127
cv2.namedWindow('create_img', cv2.WINDOW_AUTOSIZE)
cv2.imshow('create_img', img)
'''
注意: 这里的类型(dtype)要选择合适的类型,否则会出现各种预料不到的情况。
前面的这种图像取反的操作太慢了简直,因为我们使用的是解释性的语言,so 在这里我们直接调用OpenCV的C/CPP的API,
来看一下
c_trans = cv2.bitwise_not(img)
直接减少了几千倍的时间
所以 尽量call API