1. 像素的读写

可以根据像素的行和列的坐标获取它的像素值。对 BGR 图像而言,返回值为 B,G,R 的值。

  • img.shape 可以获取图像的形状。它的返回值是一个包含行数 h,列数 w,通道数 ch 的元组。注意:如果图像是灰度图,返回值仅有行数和列数。所以通过检查这个返回值就可以知道加载的是灰度图还是彩色图。
  • img.size 可以返回图像的像素数目 (h * w * ch)
  • img.dtype 返回的是图像的数据类型:
import cv2image_name = "img/003.jpg"
img = cv2.imread(image_name)
cv2.imshow("origin", img)high, wide, channel = img.shape
print "high is {0}, wide is {1}, channel is {2}".format(high, wide, channel)
# high is 198, wide is 198, channel is 3for row in range(high):for col in range(wide):b, g, r = img[row, col]b = 255 - bg = 255 - gr = 255 - rimg[row, col] = b, g, r      # 修改像素值cv2.imshow("output", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

显示结果:

如果上面的难以理解,可以看下面的这些操作,希望能帮助读者更好的理解。

>>> a = np.array([[[1,  2],  [3,4], [5, 6]], [[11,  22],  [33,44], [55, 66]]])
>>> a.shape
(2, 3, 2)
>>> a
array([[[ 1,  2],[ 3,  4],[ 5,  6]],[[11, 22],[33, 44],[55, 66]]])>>> a.ndim
3
>>> a.size
12
>>> a[0, 1]
array([3, 4])
>>> a[1, 2]
array([55, 66])
>>> h, w = a[1, 2]
>>> h,w
(55, 66)

2. 像素的算术运算

图像像素也可以进行加、减、乘、除操作,但是必须要注意,进行算术运算操作的时,必须要保证两幅图像的大小、数据类型和通道数目必须相同

  • OpenCV 中的加法与 Numpy 的加法是有所不同的。OpenCV 的加法是一种饱和操作,而 Numpy 的加法是一种模操作。这种差别在你对两幅图像进行加法时会更加明显。OpenCV 的结果会更好一点。所以我们尽量使用 OpenCV 中的函数。

使用示例如下:

import cv2
import numpy as npimg1 = cv2.imread("img/003.jpg")
img2 = cv2.imread("img/003_gray.jpg")cv2.imshow("img1", img1)
cv2.imshow("img2", img2)h, w, ch = img1.shapeadd_result = np.zeros(img1.shape, img1.dtype)
cv2.add(img1, img2, add_result)
cv2.imshow("add_result", add_result)sub_result = np.zeros(img1.shape, img1.dtype)
cv2.subtract(img1, img2, sub_result)
cv2.imshow("sub_result", sub_result)mul_result = np.zeros(img1.shape, img1.dtype)
cv2.multiply(img1, img2, mul_result)
cv2.imshow("mul_result", mul_result)div_result = np.zeros(img1.shape, img1.dtype)
cv2.divide(img1, img2, div_result)
cv2.imshow("div_result", div_result)
cv2.waitKey(0)
cv2.destroyAllWindows()


3. 像素的逻辑运算

这里包括的按位操作有:AND,OR,NOT,XOR 等。当我们提取图像的一部分,选择非矩形 ROI 时这些操作会很有用。下面的例子就是教给我们如何改变一幅图的特定区域。

import cv2
import numpy as np# create img one
img1 = np.zeros(shape=(200, 200, 3), dtype=np.uint8)
img1[50:100, 50:100, 1] = 255
img1[50:100, 50:100, 2] = 255
cv2.imshow("img1", img1)# create img two
img2 = np.zeros(shape=(200, 200, 3), dtype=np.uint8)
img2[75:150, 75:150, 2] = 255
cv2.imshow("img2", img2)dst1 = cv2.bitwise_and(img1, img2)
dst2 = cv2.bitwise_or(img1, img2)
dst3 = cv2.bitwise_xor(img1, img2)cv2.imshow("dst1", dst1)
cv2.imshow("dst2", dst2)
cv2.imshow("dst3", dst3)img4 = cv2.imread("img/003.jpg")
dst4 = cv2.bitwise_not(img4)cv2.imshow("dst4", dst4)
cv2.waitKey(0)
cv2.destroyAllWindows()


4. 像素的统计

像素值统计涉及到的知识点有以下几个

  • 最小(min)
  • 最大(max)
  • 均值(mean)
  • 标准方差(standard deviation)

OpenCV 相关的 API 知识点

  • 最大最小值 minMaxLoc
  • 计算均值与标准方差 meanStdDev

注意:像素值统计必须是单通道的图片,所以 cv2.imread 时必须加上图片的载入类型。
源码中有如下提示:

'''
The function do not work with multi-channel arrays. If you need to find minimum or maximum
elements across all the channels, use Mat::reshape first to reinterpret the array as
single-channel.
'''
import cv2
import numpy as npimg = cv2.imread("img/003.jpg", cv2.IMREAD_GRAYSCALE)minVal, maxVal, minLoc, maxLoc = cv2.minMaxLoc(img)
print minVal, maxVal, minLoc, maxLoc    # 0.0 255.0 (128, 24) (120, 12)
means, stddev = cv2.meanStdDev(img)
print means, stddev     # [[97.23278237]] [[45.80720813]]img[np.where(img < means)] = 0
img[np.where(img > means)] = 255cv2.imshow("binary", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

Python+OpenCV 图像处理系列(4)—— 图像像素的读写、算术运算、逻辑运算及像素的统计相关推荐

  1. Python+OpenCV 图像处理系列(9)—— 图像的翻转和缩放插值

    1. 图像的翻转 图像翻转 (Image Flip),图像翻转的本质像素映射,OpenCV 支持三种图像翻转方式: X轴翻转,flipcode = 0 Y轴翻转, flipcode = 1 XY轴翻转 ...

  2. Python+OpenCV 图像处理系列(8)—— Numpy 对象及图像对象创建与赋值

    1. Numpy 相关知识 1.1 Ndarray 对象 在了解 OpenCV 的图像对象之前我们先对 NumPy 的基础知识做一回顾,方便我们后续更进一步理解图像对象的一系列操作. In [2]: ...

  3. Python+OpenCV 图像处理系列(5)—— 图像 ROI 操作及通道的拆分合并

    1. 图像 ROI 有时你需要对一幅图像的特定区域进行操作.例如我们要检测一副图像中眼睛的位置,我们首先应该在图像中找到脸,再在脸的区域中找眼睛,而不是直接在一幅图像中搜索.这样会提高程序的准确性和性 ...

  4. Python+OpenCV 图像处理系列(7)—— 图像色彩空间及转换

    1. 色彩空间转换函数 cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 第一个参数为加载在内存的读片,第二个参数为转换的类型,其中包括: COLOR_BGR2GRAY = ...

  5. Python+OpenCV 图像处理系列(3)—— 画线、矩形、画圆、画椭圆、画多边形

    OpenCV 中的绘图函数 使用 OpenCV 绘制不同几何图形,其中包括的函数有 cv2.line() cv2.circle() cv2.rectangle() cv2.ellipse() cv2. ...

  6. Python+OpenCV 图像处理系列(1)— Ubuntu OpenCV安装、图片加载、显示和保存

    Ubuntu 16.04 下安装 Opencv sudo apt-get install libopencv-dev sudo apt-get install python-opencv 或者使用 p ...

  7. Python+OpenCV 图像处理系列(2)—— 视频捕获、播放和保存

    1.视频捕获 为了获取视频,首先需要创建一个 VideoCapture 类对象.它的参数可以是设备的索引号,或者是一个视频文件.设备索引号就是在指定要使用的摄像头.一般的笔记本电脑都有内置摄像头.所以 ...

  8. Python+OpenCV图像处理(五)——图像阈值和二值化

    系列文章 Python+OpenCV图像处理(一)--OpenCV框架与图像插值算法 Python+OpenCV图像处理(二)--几何变换 Python+OpenCV图像处理(三)--彩色空间互换 P ...

  9. Python OpenCV 图像处理之 图像运算和图像位运算知识补充

    Python OpenCV 365 天学习计划,与橡皮擦一起进入图像领域吧.本篇博客是这个系列的第 51 篇. 该系列文章导航参考:https://blog.csdn.net/hihell/categ ...

最新文章

  1. MySQL下载与安装教程以及环境变量配置
  2. jsp判断语句_Java的web展现层JSP的JSTL标签详细总结
  3. Spring Cloud - 服务消费者Ribbon
  4. 如何学好初中计算机,初中生怎么学习方法好 十大方法告诉你
  5. 单价数量和总价的公式_人教版四年级数学上册单价、数量和总价之间的关系微课...
  6. java 8 lambda 申明_2019-02-03——Java8 Lambda
  7. centerpython_centeros下安装python3
  8. 香蕉派 Banana pi BPI-M1+ 双核开源单板计算机. 板载WIFI
  9. 如何在 Mac 上进行屏幕录制?
  10. sql Server 发送邮件 错误类型及原因
  11. 聊聊spring cloud的HystrixCircuitBreakerConfiguration
  12. 如何对销售额进行预测?
  13. java魂斗罗zip_魂斗罗rom
  14. 六. 先有鸡还是先有蛋?--SLAM
  15. Scrolling and zooming chart with ChartScroller
  16. 湖北出台禁犬令PHP 新闻,湖北省拟出台最严禁狗令,禁止饲养包括中华田园犬在内的多种狗狗...
  17. js中push和concat合并数组的区别
  18. Broadcasts在Android7.0以及Android8.0中的变更
  19. Windows下VirtualBox下载安装
  20. React - redux 使用(由浅入深)

热门文章

  1. 2022-2028年中国基因工程药物产业市场研究及前瞻分析报告
  2. GCC 编译 C++ 程序分步骤流程(预处理 gcc -E、编译 gcc -S、汇编 gcc -c 和链接 gcc 以及 gcc -o 选项)
  3. python技巧提升
  4. CMD 输入中文看不到输入法的解决方法
  5. ImportError: DLL load failed: 找不到指定的模块。 TensorFlow 1.13
  6. LeetCode简单题之两数之和 IV - 输入 BST
  7. CodeGen融合核心关系循环扩展
  8. RTOS诊断和错误检查
  9. YOLOv3和YOLOv4长篇核心综述(下)
  10. 2021年大数据ELK(二十七):数据可视化(Visualize)