一.改变图片每个像素点每个通道的灰度值

(一)

代码如下:

  1. #遍历访问图片每个像素点,并修改相应的RGB
  2. import cv2 as cv
  3. def access_pixels(image):
  4. print(image.shape)
  5. height = image.shape[0]
  6. width = image.shape[1]
  7. channels = image.shape[2]
  8. print("width: %s height: %s channels: %s"%(width, height, channels))
  9. for row in range(height):
  10. for col in range(width):
  11. for c in range(channels):
  12. pv = image[row , col, c] #获取每个像素点的每个通道的数值
  13. image[row, col, c]=255 - pv #灰度值是0-255 这里是修改每个像素点每个通道灰度值
  14. cv.imshow("second_image",image)
  15. src=cv.imread('E:\imageload\example.png') #blue, green, red
  16. cv.namedWindow('first_image', cv.WINDOW_AUTOSIZE)
  17. cv.imshow('first_image', src)
  18. t1 = cv.getTickCount() #GetTickcount函数返回从操作系统启动到当前所经过的毫秒数
  19. access_pixels(src)
  20. t2 = cv.getTickCount()
  21. time = (t2-t1)/cv.getTickFrequency() #getTickFrequency函数返回CPU的频率,就是每秒的计时周期数
  22. print("time : %s ms"%(time*1000) ) #输出运行时间
  23. cv.waitKey(0)
  24. cv.destroyAllWindows()

运行结果:

注意:

1.image[i,j,c]   i表示图片的行数,j表示图片的列数,c表示图片的通道数(0代表B,1代表G,2代表R    一共是RGB三通道)。坐标是从左上角开始

2.每个通道对应一个灰度值。灰度值概念:把白色与黑色之间按对数关系分成若干级,称为“灰度等级”。范围一般从0到255,白色为255,黑色为0。要详细了解灰度值和通道的概念,请参考这篇博客:https://blog.csdn.net/silence2015/article/details/53789748

(二)

上述代码实现像素取反的运行时间较长,下面代码运用opencv自带的库函数可以使运行时间大大减少。

代码如下:

  1. #调用opencv的库函数快速实现像素取反
  2. import cv2 as cv
  3. def inverse(img):
  4. img = cv.bitwise_not(img) #函数cv.bitwise_not可以实现像素点各通道值取反
  5. cv.imshow("second_image", img)
  6.  
  7. src=cv.imread('E:\imageload\example.png') #blue, green, red
  8. cv.namedWindow('first_image', cv.WINDOW_AUTOSIZE)
  9. cv.imshow('first_image', src)
  10. t1 = cv.getTickCount() #GetTickcount函数返回从操作系统启动到当前所经过的毫秒数
  11. inverse(src)
  12. t2 = cv.getTickCount()
  13. time = (t2-t1)/cv.getTickFrequency() #getTickFrequency函数返回CPU的频率,就是每秒的计时周期数
  14. print("time : %s ms"%(time*1000) ) #输出运行时间
  15. cv.waitKey(0)
  16. cv.destroyAllWindows()

运行结果:

可见,使用库函数 bitwise_not 可以使运行时间缩短13倍左右

二.自定义一张三通道图片

代码如下:

  1. #自定义一张三通道图片
  2. import cv2 as cv
  3. import numpy as np
  4. def creat_image():
  5. img = np.zeros([400, 400, 3], np.uint8) #将所有像素点的各通道数值赋0
  6. img[:, :, 0] = np.ones([400, 400]) * 255 #0通道代表B
  7. # img[:, :, 1] = np.ones([400, 400]) * 255 #1通道代表G
  8. # img[:, :, 2] = np.ones([400, 400]) * 255 #2通道代表R
  9. cv.imshow("new_image",img)
  10. creat_image()
  11. cv.waitKey(0)
  12. cv.destroyAllWindows()

运行结果:

注意:

1.np.zeros函数用于创建一个数值全为0的矩阵,np.ones用于创建一个数值全为1的矩阵

2.当图片为多通道图片时,B:255  G:0  R:0 则三通道图片显示蓝色。所有通道数值组合示意图如下:

补注:

单通道: 此通道上值为0-255。 (255为白色,0是黑色) 只能表示灰度,不能表示彩色。
三通道:BGR (255,255,255为白色, 0,0,0是黑色 )  可以表示彩色, 灰度也是彩色的一种。

单通道和三通道区别见博客:https://blog.csdn.net/qq_32211827/article/details/56854985

三、自定义一张单通道图片

代码如下:

  1. #自定义一张单通道图片
  2. import cv2 as cv
  3. import numpy as np
  4. def creat_image():
  5. img = np.ones([400, 400, 1], np.uint8) #该像素点只有一个通道,该函数使所有像素点的通道的灰度值为1
  6. img = img * 127 #使每个像素点单通道的灰度值变为127
  7. cv.imshow("new_image",img)
  8. creat_image()
  9. cv.waitKey(0)
  10. cv.destroyAllWindows()

运行结果:

注意:

1.代码里 img = img * 127    表示数组里的每个数值都乘以127

2.之所以np.ones函数参数类型是uint8,是因为uint8数的范围为0~255,  那么为0时恰好为黑色,为255时恰好为白色。若函数参数类型为int8,则int8类型数的范围为-128~127,那么-128则为黑色,127为白色

 

Python+OpenCV图像处理(三)—— Numpy数组操作图片的更多相关文章

  1. Python+OpenCV图像处理(二)——打印图片属性、设置图片存储路径、电脑摄像头的调取和显示

    一. 打印图片属性.设置图片存储路径 代码如下: #打印图片的属性.保存图片位置 import cv2 as cv import numpy as np #numpy是一个开源的Python科学计算库 ...

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

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

  3. python skimage图像处理(三)

    python skimage图像处理(三) This blog is from: https://www.jianshu.com/p/7693222523c0  霍夫线变换 在图片处理中,霍夫变换主要 ...

  4. Python+OpenCV图像处理(一)

    Python+OpenCV图像处理(一): 读取,写入和展示图片 调用摄像头拍照 调用摄像头录制视频 1. 读取.写入和展示图片 图像读入:cv2.imread() 使用函数cv2.imread() ...

  5. Python+OpenCV图像处理(一)——读取显示一张图片

    先在此处先声明,后面学习python+opencv图像处理时均参考这位博主的博文https://blog.csdn.net/u011321546/article/category/7495016/2? ...

  6. Numpy 数组操作

    Numpy 数组操作 Numpy 中包含了一些函数用于处理数组,大概可分为以下几类: 修改数组形状 翻转数组 修改数组维度 连接数组 分割数组 数组元素的添加与删除 修改数组形状 函数 描述 resh ...

  7. Numpy数组操作

    """ Numpy 数组操作 修改数组形状 函数 描述 reshape 不改变数据的条件下修改形状 flat 数组元素迭代器 flatten 返回一份数组拷贝,对拷贝所做 ...

  8. Python数据分析工具库-Numpy 数组支持库(一)

    1 Numpy数组 在Python中有类似数组功能的数据结构,比如list,但在数据量大时,list的运行速度便不尽如意,Numpy(Numerical Python)提供了真正的数组功能,以及对数据 ...

  9. python numpy数组操作

    数组的创建 import numpy as np arr1 = np.array([3,10,8,7,34,11,28,72]) arr2 = np.array(((8.5,6,4.1,2,0.7), ...

随机推荐

  1. vuex操作

    import Vuex from 'vuex' //引入Vue.use(Vuex) //加载到Vue中//创建一个数据存储对象var store=new Vuex.Store({ //state可以当 ...

  2. Python中__repr__和__str__区别(转)

    class Test(object): def __init__(self, value='hello, world!'): self.data = value >>> t = Te ...

  3. OpenVPN简介及架构详解

    OpenVPN简介 1 简介    VPN(Virtual Private Network)直译就是虚拟专用通道,是提供给企业之间或者个人与公司之间安全数据传输的隧道. OpenVPN无疑是Linux ...

  4. syslog-ng应用详解

    syslog-ng应用详解   科技小能手 2017-11-07 02:43:00 浏览136 评论0 日志 LOG 配置 主机 syslog source file varchar 摘要: 最近做一 ...

  5. (转)Geth控制台使用及Web3.js使用实战

    在开发以太坊去中心化应用,免不了和以太坊进行交互,那就离不开Web3.Geth 控制台(REPL)实现了所有的web3 API及Admin API,使用好 Geth 就是必修课.结合Geth命令用法阅 ...

  6. Python 全栈开发五 迭代器 生成器 装饰器

    一.迭代器 迭代协议:对象必须提供一个next方法,执行该方法后会返回迭代的下一项或者抛出Stopiteration异常,终止迭代.切只能往前,不能倒退. 可迭代对象:遵循迭代写一点对象就是可迭代对象 ...

  7. 部分还款-还款试算接口-python

    一.swagger-ui中 二.python中调用接口,出现的问题: 解决办法: import requests # 还款试算接口 ur1='http://10.253.43.83:8399/repa ...

  8. js 数组里面任意两个数的和与目标值

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  9. 学习erlang书籍 - 转

    Here are a few resources:Programming Erlang, by Joe Armstrong. A good book, really teaching you more ...

  10. lsof命令简介

    lsof命令简介: lsof(list open files)是一个列出当前系统打开文件的工具.在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件 ...