利用numpy实现多维数组操作图片
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实现多维数组操作图片的更多相关文章
- Python数据分析 | Numpy与1维数组操作
作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/33 本文地址:http://www.showmeai.tech/article-det ...
- NumPy之:ndarray多维数组操作
NumPy之:ndarray多维数组操作 目录 简介 创建ndarray ndarray的属性 ndarray中元素的类型转换 ndarray的数学运算 index和切片 基本使用 index wit ...
- Numpy 笔记: 多维数组的切片(slicing)和索引(indexing)【转】
目录 切片(slicing)操作 索引(indexing) 操作 最简单的情况 获取多个元素 切片和索引的同异 切片(slicing)操作 Numpy 中多维数组的切片操作与 Python 中 lis ...
- matlab学习笔记11_1低维数组操作
一起来学matlab-matlab学习笔记11 11_1 低维数组操作repmat函数,cat函数,diag函数 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 <matlab ...
- 初识numpy的多维数组对象ndarray
PS:内容来源于<利用Python进行数据分析> 一.创建ndarray 1.array :将一个序列(嵌套序列)转换为一个数组(多维数组) In[2]: import numpy as ...
- python的二维数组操作
需要在程序中使用二维数组,网上找到一种这样的用法: ? 1 2 3 4 5 6 #创建一个宽度为3,高度为4的数组 #[[0,0,0], # [0,0,0], # [0,0,0], # [0,0,0] ...
- 什么是二维数组?二维遍历?Java二维数组制作图片迷宫 使用如鹏游戏引擎制作窗口界面 附带压缩包下载,解压后双击start.bat启动
什么是二维数组? 数组当中放的还是数组 int [][] arr=new int[3][2]; 有3个小箱子,每个箱子2个格子. 看结果? int [][] arr=new int[3][2]; Sy ...
- numpy中多维数组的绝对索引
这涉及到吧多维数组映射为一维数组. 对于3维数组,有公式: def MAP(x,y,z): return y_s * z_s * x + z_s * y + z 此公式可以推广到N维 测试代码:(两个 ...
- 06-01 Java 二维数组格式、二维数组内存图解、二维数组操作
二维数组格式1 /* 二维数组:就是元素为一维数组的一个数组. 格式1: 数据类型[][] 数组名 = new 数据类型[m][n]; m:表示这个二维数组有多少个一维数组. n:表示每一个一维数组的 ...
随机推荐
- Element没更新了?Element没更新,基于El的扩展库更新
think-vuele 基于Vue和ElementUI框架进行整合二次开发的一个框架.提供一些elementUI没有的或当时没有的控件.优化了或简化了便于2B软件开发的一些控件 demo:http:/ ...
- javaweb_HTML
第一章:网页的构成 1.1概念:b/s与c/s 1.1.1 现在的软件开发的整体架构主要分为B/S架构与C/S架构: b/s:浏览器/服务器 c/s:客户端/服务器 客户端:需要安装在系统里,才可使用 ...
- 题解 P4325 【[COCI2006-2007#1] Modulo】
第\(1\)种方法 也是最暴力的一种 我们熟知,\(c++\)中的\(set\)可以既去重,有排序,这题,我们可以用set来搞,虽然我们不需要排序的功能,但毕竟方便,一共是\(10\)个数,所以暴力一 ...
- 进制-Adding Two Negabinary Numbers
2020-02-20 14:52:41 问题描述: 问题求解: 最开始的想法是将两个数字先转化成自然数在求和,最后转化回去,但是实际上这种方案是不可取的,主要的问题就是会爆掉. 那么就得按位进行运算了 ...
- [单调栈]小A的柱状图
链接:https://ac.nowcoder.com/acm/problem/23619来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言52428 ...
- 微服务实战——高可用的SpringCloudConfig
管理微服务配置 对于单体应用架构来说,会使用配置文件管理我们的配置,这就是之前项目中的application.properties或application.yml.如果需要在多环境下使用,传统的做法是 ...
- 【SQL SERVER】锁机制
锁定是 SQL Server 数据库引擎用来同步多个用户同时对同一个数据块的访问的一种机制. 基本概念 利用SQL Server Profiler观察锁 死锁产生的原因及避免 总结 基本概念 数据库引 ...
- vscode下搭建typescript时提示"无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称"错误的解决方法
根据网上的教程,安装了node.js后,再安装了typescript,,,这时候编译生成或者在vscode的终端里调用npm或者tsc --version时,总是提示 npm : 无法将"n ...
- coding++:Spring Boot全局事务解释及使用(一)
Spring 事务的入口: TxAdviceBeanDefinitionParser 解释 <tx:advice/> 这里将解析tx的配置. @Override protected Cla ...
- RADI
一.RADI分类 radi0: 优势:读性能提升,磁盘利用率百分百 缺点:没有容错,坏一个全坏.写性能下降 radi1 优势:有容错能力 缺点:消耗磁盘 radi5 优势:有容错能力,读写能力提升 缺 ...