【OpenCV学习笔记 1】ndarray数组与像素点

 

 

读取

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值