• 利用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()

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

        

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

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

  • 相关阅读:
    一名3年工作经验的程序员面试分享应该具备的技能
    [activiti] Activiti 5.18 的Mybatis版本依赖问题
    [java] JVM监控与调优
    [mysql] mysqldump 导出数据库表
    【extjs】 extjs5 Ext.grid.Panel 搜索示例
    [tomcat] tomcat+nginx 负载均衡配置
    [mysql] mysql explain 使用
    Oracle自用脚本(持续更新)
    Mysql 简单问题汇总(持续更新)
    开源项目导入eclipse的一般步骤
  • 原文地址:https://www.cnblogs.com/1121518wo/p/10804043.html
Copyright © 2020-2023  润新知