1、上次介绍了一点点numpy的操作,今天我们来介绍它如何用多维数组操作图片,这之前我们要了解一下色彩是由blue ,green ,red 三种颜色混合而成,0:表示黑色 ,127:灰色 ,255:白色   ;接下来我们还是来看代码:

 import cv2 as cv
import numpy as np def access_piexls(image):
print(image.shape) #获取图像的形状大小
height=image.shape[0] #图像的第一维度高度
width=image.shape[1] #图像的第二维度宽度
channels=image.shape[2] #图像的第三维度通道数
print("height : %s , width :%s , channels: %s"%(height,width,channels))
for row in range(height):
for col in range(width):
for c in range(channels):
pv=image[row,col,c] #一个三维数组,来获取每个维度的值
image[row,col,c]=255-pv #修改它的颜色显示
cv.imshow("hhhh",image)
src=cv.imread("D:\hh.JPG") #blue green red 色彩通道,这是基本的色彩构成,后面会学到 0:表示黑色 255:表示白色 cv.namedWindow('input image',0)
cv.imshow('input image',src)
t1=cv.getTickCount() #获取当前cpu转动的时间
22 access_piexls(src)
t2=cv.getTickCount()
print("time : %s ms" %((t2-t1)/cv.getTickFrequency()*1000)) #计算走了多少秒
cv.waitKey(-1)
cv.destoryAllWindows()

最终实现的效果如下(我们可以看到cpu 显示这这张修改后的照片时间是9秒左右,同时照片的颜色也被改变了):

2、接下来我们我可以在这个基础上创建出一张新的照片来:

 import cv2 as cv
import numpy as np def access_piexls(image):
print(image.shape) #获取图像的形状大小
height=image.shape[0] #图像的第一维度高度
width=image.shape[1] #图像的第二维度宽度
channels=image.shape[2] #图像的第三维度通道数
print("height : %s , width :%s , channels: %s"%(height,width,channels))
for row in range(height):
for col in range(width):
for c in range(channels):
pv=image[row,col,c] #一个三维数组,来获取每个维度的值
image[row,col,c]=255-pv #修改它的颜色显示
cv.imshow("hhhh",image)
def creat_image():
img = np.zeros([400,400,3],np.uint8) #全zeros时 创建一个图片,高为400,宽为400,三个色彩通道矩阵图像 类型为uint8,这个时候我们还没有对图片进行颜色改变
cv.imshow("new_img", img) src=cv.imread("D:\hh.JPG") #blue green red 色彩通道,这是基本的色彩构成,后面会学到 0:表示黑色 255:表示白色 cv.namedWindow('input image',0)
cv.imshow('input image',src)
t1=cv.getTickCount() #获取当前cpu转动的时间
#access_piexls(src)
creat_image()
t2=cv.getTickCount()
print("time : %s ms" %((t2-t1)/cv.getTickFrequency()*1000)) #计算走了多少秒
cv.waitKey(-1)
cv.destoryAllWindows()

最终效果是一张黑色的照片:

3、接下来我们把这张新建的黑色照片,对它进行颜色操作,把它改成blue,也就是对颜色第一颜色通道进行多维数组操作(当然你也可以对其两个颜色通道进行修改):

 import cv2 as cv
import numpy as np def access_piexls(image):
print(image.shape) #获取图像的形状大小
height=image.shape[0] #图像的第一维度高度
width=image.shape[1] #图像的第二维度宽度
channels=image.shape[2] #图像的第三维度通道数
print("height : %s , width :%s , channels: %s"%(height,width,channels))
for row in range(height):
for col in range(width):
for c in range(channels):
pv=image[row,col,c] #一个三维数组,来获取每个维度的值
image[row,col,c]=255-pv #修改它的颜色显示
cv.imshow("hhhh",image)
def creat_image():
img = np.zeros([400,400,3],np.uint8) #全zeros时 创建一个图片,高为400,宽为400,三个色彩通道矩阵图像 类型为uint8,这个时候我们还没有对图片进行颜色改变
img[: , : , 0]=np.ones([400,400])*255 #修改第一通道的颜色为blue 对第一个颜色通道操作
cv.imshow("new_img", img) src=cv.imread("D:\hh.JPG") #blue green red 色彩通道,这是基本的色彩构成,后面会学到 0:表示黑色 255:表示白色 cv.namedWindow('input image',0)
cv.imshow('input image',src)
t1=cv.getTickCount() #获取当前cpu转动的时间
#access_piexls(src)
creat_image()
t2=cv.getTickCount()
print("time : %s ms" %((t2-t1)/cv.getTickFrequency()*1000)) #计算走了多少秒
cv.waitKey(-1)
cv.destoryAllWindows()

4、单通道操作,更加简单:

 import cv2 as cv
import numpy as np def creat_image():
img = np.ones([400,400,3],np.uint8)
img=img * 0
cv.imshow("new_img", img) cv.waitKey(-1)
cv.destoryAllWindows()

5、填充操作(当我们把创建的图片大小取小一点的话,我可以用fill(进行填充操作):

 import cv2 as cv
import numpy as np def creat_image():
m1 = np.ones([3,3],np.uint8)
m1.fill(122)
print(m1) m2=m1.reshape([1,9]) #把一行分为9列
print(m2) src=cv.imread("D:\hh.JPG") #blue green red 色彩通道,这是基本的色彩构成,后面会学到 0:表示黑色 255:表示白色 cv.namedWindow('input image',0)
cv.imshow('input image',src)
t1=cv.getTickCount() #获取当前cpu转动的时间
#access_piexls(src)
creat_image()
t2=cv.getTickCount()
print("time : %s ms" %((t2-t1)/cv.getTickFrequency()*1000)) #计算走了多少秒
cv.waitKey(-1)
cv.destoryAllWindows()

6、接下来用bitwise_not()函数实现像素取反,这样操作后读取照片的时间就非常快了:

 import cv2 as cv
import numpy as np
#进行像素取反操作,可以使读取照片的速度加快 def inverse(img):
dst=cv.bitwise_not(img)
cv.imshow("取反",dst)
src=cv.imread("D:\hh.JPG") #blue green red 色彩通道,这是基本的色彩构成,后面会学到 0:表示黑色 255:表示白色 cv.namedWindow('input image',0)
cv.imshow('input image',src)
t1=cv.getTickCount() #获取当前cpu转动的时间
#access_piexls(src)
inverse(src)
t2=cv.getTickCount()
print("time : %s ms" %((t2-t1)/cv.getTickFrequency()*1000)) #计算走了多少秒
cv.waitKey(-1)
cv.destoryAllWindows()

以上就是今天所学的东西了,就分享到这里了,睡觉了,现在是凌晨12:36,。

利用numpy实现多维数组操作图片的更多相关文章

  1. Python数据分析 | Numpy与1维数组操作

    作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/33 本文地址:http://www.showmeai.tech/article-det ...

  2. NumPy之:ndarray多维数组操作

    NumPy之:ndarray多维数组操作 目录 简介 创建ndarray ndarray的属性 ndarray中元素的类型转换 ndarray的数学运算 index和切片 基本使用 index wit ...

  3. Numpy 笔记: 多维数组的切片(slicing)和索引(indexing)【转】

    目录 切片(slicing)操作 索引(indexing) 操作 最简单的情况 获取多个元素 切片和索引的同异 切片(slicing)操作 Numpy 中多维数组的切片操作与 Python 中 lis ...

  4. matlab学习笔记11_1低维数组操作

    一起来学matlab-matlab学习笔记11 11_1 低维数组操作repmat函数,cat函数,diag函数 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 <matlab ...

  5. 初识numpy的多维数组对象ndarray

    PS:内容来源于<利用Python进行数据分析> 一.创建ndarray 1.array :将一个序列(嵌套序列)转换为一个数组(多维数组) In[2]: import numpy as ...

  6. python的二维数组操作

    需要在程序中使用二维数组,网上找到一种这样的用法: ? 1 2 3 4 5 6 #创建一个宽度为3,高度为4的数组 #[[0,0,0], # [0,0,0], # [0,0,0], # [0,0,0] ...

  7. 什么是二维数组?二维遍历?Java二维数组制作图片迷宫 使用如鹏游戏引擎制作窗口界面 附带压缩包下载,解压后双击start.bat启动

    什么是二维数组? 数组当中放的还是数组 int [][] arr=new int[3][2]; 有3个小箱子,每个箱子2个格子. 看结果? int [][] arr=new int[3][2]; Sy ...

  8. numpy中多维数组的绝对索引

    这涉及到吧多维数组映射为一维数组. 对于3维数组,有公式: def MAP(x,y,z): return y_s * z_s * x + z_s * y + z 此公式可以推广到N维 测试代码:(两个 ...

  9. 06-01 Java 二维数组格式、二维数组内存图解、二维数组操作

    二维数组格式1 /* 二维数组:就是元素为一维数组的一个数组. 格式1: 数据类型[][] 数组名 = new 数据类型[m][n]; m:表示这个二维数组有多少个一维数组. n:表示每一个一维数组的 ...

随机推荐

  1. 题解 P3205 【[HNOI2010]合唱队】

    讲讲我的做法 看了题目发现要用区间\(dp\),为什么? 我们发现区间\(dp\)有一个性质--大区间包涵小区间,这道题就符合这样的一个性质 所以我们要用区间\(dp\)来解决这道题. 如何设计状态 ...

  2. 基于 HTML5 WebGL 的 智慧楼宇能源监控系统

    前言 21世纪,在能源危机和全球气候变暖的压力下,太阳能等可再生能源越来越受到关注,其中光伏建筑一体化逐渐成为绿色发展方式和生活方式,加强节能降耗,支持低碳产业和新能源.可再生能源发展,也已经成为国家 ...

  3. F版本SpringCloud 5—Eureka集群和自我保护机制

    源码地址:https://gitee.com/bingqilinpeishenme/Java-Tutorials 前言 上篇文章中,通过代码搭建了Eureka注册中心和客户端,是Eureka的简单应用 ...

  4. ContOS7中使用Nginx进行TCP反向代理

    一.安装Nginx 1.下载:http://nginx.org/en/download.html wget http://nginx.org/download/nginx-1.16.1.tar.gz ...

  5. Convert JS object to JSON string

    Modern browsers (IE8, FF3, Chrome etc.) have native JSON support built in (Same API as with JSON2). ...

  6. 给rm命令加保险

    众所周知,脑残可以学习,但是手残没法治.相信每一位喜欢用终端操作电脑的同学都曾手误使用 rm 命令把不该删除的文件删了.然而,使用 rm 删除的文件是不会进去回收站的. 所以,最好的方法就是我们自定义 ...

  7. Python第六章-函数04-递归函数和拉姆达表达式

    五.递归函数 什么叫递归(recusive)? 你拿两个镜子互相面对着, 然后去看镜子, 会发现每个镜子中很多个镜子, 层层的嵌套, 无穷尽, 这就是一种递归! 从前有坐山, 山里有座庙, 庙里有个老 ...

  8. 推荐|近期热点机器学习git项目

    No1: InterpretML by Microsoft--Machine Learning Interpretability github地址:https://github.com/microso ...

  9. POJ - 3468 线段树单点查询,单点修改区间查询,区间修改模板(求和)

    题意: 给定一个数字n,表示这段区间的总长度.然后输入n个数,然后输入q,然后输入a,b,表示查询a,b,区间和,或者输入c 再输入三个数字a,b,c,更改a,b区间为c 思路: 线段树首先就是递归建 ...

  10. Java 获取 IP

    /** * 获取访问者IP. * 在一般情况下使用 Request.getRemoteAddr() 即可,但是经过 nginx 等反向代理软件后,这个方法会失效. */ private String ...