【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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,OpenCV是一个开源计算机视觉和机器学习软件库,用于开发图像和视频处理应用程序。通过使用OpenCV,您可以读取摄像头并显示实时图像,打开视频文件或摄像头文件,并获取视频的相关信息,例如帧宽度、帧高度、帧率和总帧数。 对于学习OpenCV,你可以按照以下步骤进行: 1. 安装OpenCV库:在开始学习OpenCV之前,您需要从OpenCV官方网站下载和安装OpenCV库。根据您的操作系统和编程语言选择合适的版本。 2. 学习基本概念:熟悉OpenCV的基本概念和术语,例如图像和视频的加载、显示、保存以及常用的图像处理操作,如滤波、边缘检测和特征提取等。 3. 掌握OpenCV函数和类:深入了解OpenCV提供的函数和类,例如cv::Mat用于图像和矩阵操作,cv::VideoCapture用于读取和处理视频,以及cv::imshow和cv::waitKey等用于显示图像的函数。 4. 实践项目:通过完成一些实践项目来应用您所学到的知识。例如,利用OpenCV实现人脸检测、目标追踪、图像识别等。 5. 学习资料和资源:查找和阅读OpenCV的官方文档、教程和示例代码,参与开源社区讨论和交流,加入相关的论坛和邮件列表等。 总结起来,学习OpenCV包括安装OpenCV库、学习基本概念、掌握OpenCV函数和类、实践项目以及查找和阅读相关资料和资源。通过不断实践和学习,您将能够更好地理解和应用OpenCV库来开发图像和视频处理应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值