利用numpy实现多维数组操作图片

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

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

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

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

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

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

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

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

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

 1 import cv2 as cv
 2 import numpy as np
 3
 4 def creat_image():
 5     img = np.ones([400,400,3],np.uint8)
 6     img=img * 0
 7     cv.imshow("new_img", img)
 8
 9 cv.waitKey(-1)
10 cv.destoryAllWindows()

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

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

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

原文地址:https://www.cnblogs.com/1121518wo/p/10804043.html

时间: 2024-11-08 12:01:37

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

利用递归把多维数组转为一维数组的函数

函数名称:array_multi2single 函数原形:array array_multi2single(array) 实现功能:把一个多维数组的数值存放到一维数组中,不保存Key. < ?php function array_multi2single($array) {     static $result_array=array();     foreach($array as $value)     {         if(is_array($value))         {    

Undefined offset原因以及解决办法-php利用for遍历二维数组方法-二维数组怎么遍历

<?php $arr3 = [ [1,2,3], [4,5,6,7], [8,9,10,11,12], ]; $len = count($arr3); $num2 = 0; $zong = 0; for($i = 0; $i < $len; $i++) { $tem = $arr3[$i]; $len2 = count($tem); for($j = 0; $j < $len2; $j++) { $num2 += $tem[$j]; $zong++; } } echo "<

python的二维数组操作

需要在程序中使用二维数组,网上找到一种这样的用法: 1 2 3 4 5 6 #创建一个宽度为3,高度为4的数组 #[[0,0,0], # [0,0,0], # [0,0,0], # [0,0,0]] myList = [[0] * 3] * 4 但是当操作myList[0][1] = 1时,发现整个第二列都被赋值,变成 [[0,1,0], [0,1,0], [0,1,0], [0,1,0]] 为什么...一时搞不懂,后面翻阅The Python Standard Library 找到答案 lis

numpy中多维数组的绝对索引

这涉及到吧多维数组映射为一维数组. 对于3维数组,有公式: def MAP(x,y,z): return y_s * z_s * x + z_s * y + z 此公式可以推广到N维 测试代码:(两个输出相同,说明测试成功) import numpy as np x_s=4 y_s=3 z_s=9 def MAP(x,y,z): return y_s * z_s * x + z_s * y + z org=np.arange(x_s*y_s*z_s) arr=np.resize(org,[x_s

mongo二维数组操作

mongodb的DBObject支持保存多维数组,在增加元素时使用"$push"操作符,在删除元素时使用"$pull". 但是在做更新时问题就来了,mongodb首先支持使用"$"来定位数组中的某个元素,例如: > t.find() { "_id" : ObjectId("4b97e62bf1d8c7152c9ccb74"), "title" : "ABC",

C语言编程 子函数中利用指针输出二维数组

一般输出方式:void print1(int arr[][3], int row, int col){int i, j;for (i = 0; i < row; i++){for (j = 0; j < col; j++){printf("%d", arr[i][j]);}printf("\n");}} 指针输出方式:void print2(int arr, int row, int col){int i, j;for (i = 0; i < ro

numpy教程:数组操作

http://blog.csdn.net/pipisorry/article/details/39496831 Array manipulation routines numpy数组基本操作,包括copy, shape, 转换(类型转换), type, 重塑等等.这些操作应该都可以使用numpy.fun(array)或者array.fun()来调用. Basic operations copyto(dst, src[, casting, where])Copies values from one

返回一个二维数组最大联通子数组的和

一.题目 输入一个二维整形数组,数组里有正数也有负数. 求所有子数组的和的最大值. 二.设计思想 方法一:首先若要对二维数组进行分析,之前我们已经做过关于一位数组的练习,所以我们可以把它化简成为一个一维数组.再先求每个一维数组的最大子数组和,并记下每行最大一维子数组的下标.这是就会分两种情况:第一种是行之间的最大子数组是相连的,这时就可以直接相加得到:第二种是不相连的,,这时候就把每行的最大子数组看成一个整体,再使每个最大数组块进行相连,求使其相连的最小代价.最后得到的结果就是最大联通子数组的和

在python中定义二维数组

发表于 http://liamchzh.0fees.net/?p=234&i=1 一次偶然的机会,发现python中list非常有意思. 先看一段代码 [py]array = [0, 0, 0]matrix = [array*3]print matrix## [[0,0,0,0,0,0,0,0,0]][/py] 这段代码其实没有新建一个二维数组 再看一段代码 [py]array = [0, 0, 0]matrix = [array] * 3print matrix## [[0, 0, 0], [