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. 解析源码,彻底弄懂HashMap(持续更新中)

    为啥突然想着看HashMap源码了? 无意间看到有人说HashMap能考验Java程序员的基本功,之前我作为面试官帮公司招人的时候偶尔问起HashMap,大部分人回答基本都会用,且多数仅停留在put, ...

  2. P1361 小M的作物 【网络流】【最小割】

    题目描述 小M在MC里开辟了两块巨大的耕地A和B(你可以认为容量是无穷),现在,小P有n中作物的种子,每种作物的种子有1个(就是可以种一棵作物)(用1...n编号). 现在,第i种作物种植在A中种植可 ...

  3. 升级 nop 4.1 Incorrect syntax near 'OFFSET'. Invalid usage of the option NEXT in the FETCH statement.

    Incorrect syntax near 'OFFSET'.  Invalid usage of the option NEXT in the FETCH statement. nop.web 项目 ...

  4. Contest 153

    2019-09-14 23:16:25 总体感受:节奏尚可,难度尚可.然而还是卡在了最后一题,完全没有想到使用dp. 注意点: 1)Contest的最后一题往往是DP,Graph,这个敏感度需要提高: ...

  5. WeChat 搭建过程

    [被动回复消息] 1.创建项目(基于MyEclipse + Tomcat 7 编写):wechat 2.导入jar包(用于解析xml):dom4j-1.6.1.jar,xstream-1.3.jar ...

  6. MySql InnoDB中的锁研究

    # MySql InnoDB中的锁研究 ## 1.InnoDB中有哪些锁### 1. 共享和排他(独占)锁(Shared and Exclusive Locks) InnoDB实现标准的行级锁定,其中 ...

  7. Vue路由配置history模式

    我的博客: https://github.com/Daotin/fe-notes/issues vue需要node.js吗? 你可以用 script 标签的形式引入vue.min.js 这样的,不需要 ...

  8. pycharm 2.7 快捷键

    提示 CTRL Q: 在参数列表位置,显示可以输入的所有参数 CTRL Q: 查看选中方法的文档字符串 阅读 CTRL -: 折叠当前代码 CTRL +: 展开当前代码 CTRL SHIFT -: 折 ...

  9. Js闭包练习2020031801

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...

  10. D 【BJOI2018】求和

    时间限制 : 20000 MS   空间限制 : 565536 KB 评测说明 : 2s,512m 问题描述 master 对树上的求和非常感兴趣.他生成了一棵有根树,并且希望多次询问这棵树上一段路径 ...