目录:
(一)图像的深度和图像的通道
 (1)图像的深度
 (2)图像的通道
(二)自定义一张多通道的图片
(1)zeros 函数
(2)ones  函数
(三)自定义一张单通道的图片
(四)像素操作
(1)numpy操作数组
(2)调用库函数
(五)opnecv 利用getTickCount()和getTickFrequency()计算执行时间
 
 
 
 
 正文:
(一)图像的深度和图像的通道
      (1)图像的深度
               图像中像素点占得bit位数,就是图像的深度,比如:
二值图像:图像的像素点不是0 就是1 (图像不是黑色就是白色),图像像素点占的位数就是 1 位,图像的深度就是1,也称作位图。
灰度图像:图像的像素点位于0-255之间,(0:全黑,255代表:全白,在0-255之间插入了255个等级的灰度)。2^8=255,图像的深度是8。
依次轮推,我们把计算机中存储单个像素点所用的 bit 位称为图像的深度。
     (2)图像的通道
             有了图像深度的概念,我们知道如果是24位的图像,则这个像素点的颜色的取值范围是:从0到2^24。这个范围特别大,如果我们知道了某店的像素值怎么判断像素点的颜色呢?我们知道 RGB是基本的三原色,如果我们用8位代表一种颜色,每种颜色最大是255,这样每个像素点的颜色值的范围就是(0-255,0-255,0-255)。这样图像的通道就是3。
灰度图的图像存储模型
 
灰度图像像素点的存储就是对应的原图从左到右,从上到下,依次排列,每个点的值就是就是像素点的值,每个点的地址就是像素像素点的地址。
RGB图的图像存储模型
RGB彩色图像和灰度图相比,每个像素点都有3个通道。每个通道占的内存空间都是8位。在内存中,RGB 图像的存储是以二维数组的形式。
学习图像的存储就是为了理解图像中像素点的存储情况,有助于我们对每个像素点的操作。
(二)自定义一张多通道的图片-----用到函数:zeros和ones
(1)zeros 函数
 1 # -*- coding=GBK -*-
2 import cv2 as cv
3 import numpy as np
4
5
6 def create_image():
7 img = np.zeros([400, 400, 3], np.uint8)#zeros:double类零矩阵 创建400*400 3个通道的矩阵图像 参数时classname为uint8
8 img[:, :, 0] = np.ones([400, 400])*255#ones([400, 400])是创建一个400*400的全1矩阵,*255即是全255矩阵 并将这个矩阵的值赋给img的第一维
9 img[:, :, 1] = np.ones([400, 400])*255#第二维全是255
10 img[:, :, 2] = np.ones([400, 400])*255#第三维全是255
11 cv.imshow("自制图片", img)#输出一张400*400的白色图片(255 255 255):蓝(B)、绿(G)、红(R)
12
13 create_image()
14 cv.waitKey(0)
15 cv.destroyAllWindows()

(2)ones  函数

 1 # -*- coding=GBK -*-
2 import cv2 as cv
3 import numpy as np
4
5
6 def create_image():
7 img = np.ones([400, 400, 3], np.uint8)
8 img[:, :, 0] = img[:, :, 0]*255
9 img[:, :, 1] = img[:, :, 1]*255
10 img[:, :, 2] = img[:, :, 2]*255
11 cv.imshow("自制图片", img)
12
13 create_image()
14 cv.waitKey(0)
15 cv.destroyAllWindows()

第8,9,10行换成

image[:, :, 0] = np.ones([400, 400]) * 255
image[:, :, 1] = np.ones([400, 400]) * 255
image[:, :, 2] = np.ones([400, 400]) * 255
建议 img[:, :, 2] = np.ones([400, 400])*255 这样赋值

(3)补充

 1 >>>from numpy import *
2 >>> a=zeros((3,4))
3 >>> a
4 array([[ 0., 0., 0., 0.],
5 [ 0., 0., 0., 0.],
6 [ 0., 0., 0., 0.]])
7 >>> from numpy import *
8 >>> a=ones((3,4))
9 >>> a
10 array([[ 1., 1., 1., 1.],
11 [ 1., 1., 1., 1.],
12 [ 1., 1., 1., 1.]])
13 >>> from numpy import *
14 >>> a=eye(3)
15 >>> a
16 array([[ 1., 0., 0.],
17 [ 0., 1., 0.],
18 [ 0., 0., 1.]])

(三)自定义一张单通道的图片

 1 # -*- coding=GBK -*-
2 import cv2 as cv
3 import numpy as np
4
5
6 def create_image():
7 img = np.ones([400, 400, 1], np.uint8)
8 img = img * 127
9 cv.imshow("自制图片", img)
10
11 create_image()
12 cv.waitKey(0)
13 cv.destroyAllWindows()
(四)像素操作
(1)numpy操作数组

读取一张图片,修改颜色通道后输出,可以得到图像的:行数,列数,通道数的矩阵,对矩阵进行操作可改变图像像素

 1 # -*- coding=GBK -*-
2 import cv2 as cv
3 import numpy as np
4
5
6 #numpy数组操作
7 def access_pixles(image):
8 print(image.shape)
9 height = image.shape[0]
10 width = image.shape[1]
11 channel = image.shape[2]
12 print("width : %s, height : %s, channel : %s" % (width, height, channel))
13 for row in range(height):
14 for col in range(width):
15 for c in range(channel):
16 pv = image[row, col, c]
17 image[row, col, c] = 255 - pv
18 cv.imshow("修改后", image)
19
20
21 src = cv.imread("C://1.jpg")
22 #cv.namedWindow("原来", cv.WINDOW_NORMAL)
23 cv.imshow("原来", src)
24 t1 = cv.getTickCount()#毫秒级别的计时函数,记录了系统启动以来的时间毫秒
25 access_pixles(src)
26 t2 = cv.getTickCount()
27 time = (t2 - t1)*1000/cv.getTickFrequency()#getTickFrequency用于返回CPU的频率,就是每秒的计时周期数
28 print("time: %s" % time)#输出运行的时间
29 cv.waitKey(0)
30 cv.destroyAllWindows()
(2)调用库函数
 1 # -*- coding=GBK -*-
2 import cv2 as cv
3 import numpy as np
4
5
6 #像素取反
7 def inverse(image):
8 dst = cv.bitwise_not(image)
9 cv.imshow("取反", dst)
10
11
12 src = cv.imread("C://1.jpg")
13 cv.namedWindow("原来", cv.WINDOW_NORMAL)
14 cv.imshow("原来", src)
15 t1 = cv.getTickCount()
16 inverse(src)
17 t2 = cv.getTickCount()
18 time = (t2 - t1)*1000/cv.getTickFrequency()
19 print("time: %s" % time)
20 cv.waitKey(0)
21 cv.destroyAllWindows()
(五)opnecv 利用getTickCount()和getTickFrequency()计算执行时间
t1 = cv.getTickCount()
picture_message(scr)
t2 = cv.getTickCount()
time = 1000*(t2-t1)/cv.getTickFrequency()
print('Time is %s ms'% time)

getTickCount():用于返回从操作系统启动到当前所经的计时周期数,看名字也很好理解,get Tick Count(s)。
getTickFrequency():用于返回CPU的频率。get Tick Frequency。这里的单位是秒,也就是一秒内重复的次数。

所以剩下的就很清晰了:
总次数/一秒内重复的次数 = 时间(s)
1000 *总次数/一秒内重复的次数= 时间(ms)

这个逻辑很清晰,没什么问题,但是这里有一个小坑,那就是C版本的cvGetTickFrequency()函数和C++版本的getTickFrequency()的单位不一样,前者以ms计算频率,后者以s为单位计算频率,所以如果使用C版本的cvGetTickFrequency()计算时间的话,应该是:
总次数/一秒内重复的次数*1000 = 时间(ms)
总次数/一秒内重复的次数= 时间(s)

参考:
https://blog.csdn.net/u013355826/article/details/64905921
https://blog.csdn.net/u011321546/article/details/79523115
https://www.cnblogs.com/jczhuang/p/9766950.html

python有关于图像的深度和通道的更多相关文章

  1. OpenCV——图像的深度与通道数讲解

    矩阵数据类型: – CV_(S|U|F)C S = 符号整型 U = 无符号整型 F = 浮点型 E.g.: CV_8UC1 是指一个8位无符号整型单通道矩阵, CV_32FC2是指一个32位浮点型双 ...

  2. TF-图像的深度和通道的概念(转)

    图像的深度和通道概念 图像的深度: 图片是由一个个像素点构成的,所有不同颜色的像素点构成了一副完整的图像,计算机存储图片是以二进制来进行的. 1 bit : 用一位来存储,那么这个像素点的取值范围就是 ...

  3. OpenCV3编程入门笔记(3)线性滤波、非线性滤波、图像深度、通道

    15     遍历图像中的像素,是先for行数后for列数的,也就是一列一列的遍历,matlab中是从1开始计数,opnecv中采用c语言的从0开始计数. 矩阵归一化:normalize()函数,参数 ...

  4. 跟我学Python图像处理丨图像特效处理:毛玻璃、浮雕和油漆特效

    摘要:本文讲解常见的图像特效处理,从而让读者实现各种各样的图像特殊效果,并通过Python和OpenCV实现. 本文分享自华为云社区<[Python图像处理] 二十四.图像特效处理之毛玻璃.浮雕 ...

  5. opencv-图像类型、深度、通道

    转自:图像类型   与  opencv中图像基础(大小,深度,通道) 一.图像基本类型 在计算机中,按照颜色和灰度的多少可以将图像分为四种基本类型. 1. 二值图像 2. 灰度图像 3. 索引图像 4 ...

  6. 【python图像处理】图像的缩放、旋转与翻转

    [python图像处理]图像的缩放.旋转与翻转 图像的几何变换,如缩放.旋转和翻转等,在图像处理中扮演着重要的角色,python中的Image类分别提供了这些操作的接口函数,下面进行逐一介绍. 1.图 ...

  7. 去除图像中的alpha通道或透明度

    自从appstore提交app改变后,虽然提交的流程还是和原来一样,但是相比以前还是有很大的改动,本来就不太喜欢 English,改版之后很多东西都变了,开发一个app就已经够他妈的蛋疼啦,上传一个a ...

  8. python 多进程处理图像,充分利用CPU

    默认情况下,Python程序使用一个CPU以单个进程运行.不过如果你是在最近几年配置的电脑,通常都是四核处理器,也就是有8个CPU.这就意味着在你苦苦等待Python脚本完成数据处理工作时,你的电脑其 ...

  9. 基于Ubuntu+Python+Tensorflow+Jupyter notebook搭建深度学习环境

    基于Ubuntu+Python+Tensorflow+Jupyter notebook搭建深度学习环境 前言一.环境准备环境介绍软件下载VMware下安装UbuntuUbuntu下Anaconda的安 ...

随机推荐

  1. VUE -input输入框字母转大写

    示例: 输入自动转--->大写 <input type="text" placeholder="请输入证件号码" maxlength="1 ...

  2. 数值计算:粒子群优化算法(PSO)

    PSO 最近需要用上一点最优化相关的理论,特地去查了些PSO算法相关资料,在此记录下学习笔记,附上程序代码.基础知识参考知乎大佬文章,写得很棒! 传送门 背景 起源:1995年,受到鸟群觅食行为的规律 ...

  3. keystore password was incorrect

    一.问题由来 最近在部署后台系统项目的时候,希望给项目增加一些安全措施,在项目中添加了SSL证书,可是在自己添加完该证书后,测试启动项目立马报错. 报错信息如下: org.springframewor ...

  4. WEB 标准以及 W3C 的理解与认识

    01.  WEB标准 ①  web标准 简单来说可以分为结构.表现和行为. ②  结构:主要是有HTML标签组成(通俗点说,在页面body里面我们写入的标签都是为了页面的结构)   表现:即指css样 ...

  5. hdu3001(三进制状压)

    题目大意: 现在给你一个有n个点和m条边的图,每一条边都有一个费用,每个点不能经过超过两次,求所有点至少遍历一次的最小费用 其中n<=10 m没有明确限制(肯定不会超过1e5) 一看到这个数据范 ...

  6. Tomcat实现自定义类加载器

    什么是类加载器? 这是官方给的定义 在 Java 虚拟机的实现中,初始类可以作为命令行参数提供. 或者,该实现可以提供一个初始类,该类设置一个类加载器,该类加载器依次加载应用程序. 初始类的其他选择也 ...

  7. vue.$nextTick实现原理

    源码: const callbacks = [] let pending = false function flushCallbacks () { pending = false const copi ...

  8. 关于takin-data,你想知道的都在这里(一)启动命令篇

    通过docker部署体验takin的小伙伴都应该知道,在安装部署手册中有提到:在启动surge-deploy任务前,需要将启动命令中的ip参数替换为docker容器所在宿主机的ip,很多小伙伴都在这里 ...

  9. 【二食堂】Beta - 测试报告

    Beta - 测试报告 测试过程中发现的bug Beta阶段的新bug 我们在Beta阶段的开发过程中就进行了测试,发现了许多bug.这其中后端的bug比较多,在这里我列举一些比较重要的功能性bug. ...

  10. (数据科学学习手札129)geopandas 0.10版本重要新特性一览

    本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 就在前不久,我们非常熟悉的Python地理 ...