Python+OpenCV 图像处理系列(4)—— 图像像素的读写、算术运算、逻辑运算及像素的统计
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)—— 图像像素的读写、算术运算、逻辑运算及像素的统计相关推荐
- Python+OpenCV 图像处理系列(9)—— 图像的翻转和缩放插值
1. 图像的翻转 图像翻转 (Image Flip),图像翻转的本质像素映射,OpenCV 支持三种图像翻转方式: X轴翻转,flipcode = 0 Y轴翻转, flipcode = 1 XY轴翻转 ...
- Python+OpenCV 图像处理系列(8)—— Numpy 对象及图像对象创建与赋值
1. Numpy 相关知识 1.1 Ndarray 对象 在了解 OpenCV 的图像对象之前我们先对 NumPy 的基础知识做一回顾,方便我们后续更进一步理解图像对象的一系列操作. In [2]: ...
- Python+OpenCV 图像处理系列(5)—— 图像 ROI 操作及通道的拆分合并
1. 图像 ROI 有时你需要对一幅图像的特定区域进行操作.例如我们要检测一副图像中眼睛的位置,我们首先应该在图像中找到脸,再在脸的区域中找眼睛,而不是直接在一幅图像中搜索.这样会提高程序的准确性和性 ...
- Python+OpenCV 图像处理系列(7)—— 图像色彩空间及转换
1. 色彩空间转换函数 cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 第一个参数为加载在内存的读片,第二个参数为转换的类型,其中包括: COLOR_BGR2GRAY = ...
- Python+OpenCV 图像处理系列(3)—— 画线、矩形、画圆、画椭圆、画多边形
OpenCV 中的绘图函数 使用 OpenCV 绘制不同几何图形,其中包括的函数有 cv2.line() cv2.circle() cv2.rectangle() cv2.ellipse() cv2. ...
- Python+OpenCV 图像处理系列(1)— Ubuntu OpenCV安装、图片加载、显示和保存
Ubuntu 16.04 下安装 Opencv sudo apt-get install libopencv-dev sudo apt-get install python-opencv 或者使用 p ...
- Python+OpenCV 图像处理系列(2)—— 视频捕获、播放和保存
1.视频捕获 为了获取视频,首先需要创建一个 VideoCapture 类对象.它的参数可以是设备的索引号,或者是一个视频文件.设备索引号就是在指定要使用的摄像头.一般的笔记本电脑都有内置摄像头.所以 ...
- Python+OpenCV图像处理(五)——图像阈值和二值化
系列文章 Python+OpenCV图像处理(一)--OpenCV框架与图像插值算法 Python+OpenCV图像处理(二)--几何变换 Python+OpenCV图像处理(三)--彩色空间互换 P ...
- Python OpenCV 图像处理之 图像运算和图像位运算知识补充
Python OpenCV 365 天学习计划,与橡皮擦一起进入图像领域吧.本篇博客是这个系列的第 51 篇. 该系列文章导航参考:https://blog.csdn.net/hihell/categ ...
最新文章
- MySQL下载与安装教程以及环境变量配置
- jsp判断语句_Java的web展现层JSP的JSTL标签详细总结
- Spring Cloud - 服务消费者Ribbon
- 如何学好初中计算机,初中生怎么学习方法好 十大方法告诉你
- 单价数量和总价的公式_人教版四年级数学上册单价、数量和总价之间的关系微课...
- java 8 lambda 申明_2019-02-03——Java8 Lambda
- centerpython_centeros下安装python3
- 香蕉派 Banana pi BPI-M1+ 双核开源单板计算机. 板载WIFI
- 如何在 Mac 上进行屏幕录制?
- sql Server 发送邮件 错误类型及原因
- 聊聊spring cloud的HystrixCircuitBreakerConfiguration
- 如何对销售额进行预测?
- java魂斗罗zip_魂斗罗rom
- 六. 先有鸡还是先有蛋?--SLAM
- Scrolling and zooming chart with ChartScroller
- 湖北出台禁犬令PHP 新闻,湖北省拟出台最严禁狗令,禁止饲养包括中华田园犬在内的多种狗狗...
- js中push和concat合并数组的区别
- Broadcasts在Android7.0以及Android8.0中的变更
- Windows下VirtualBox下载安装
- React - redux 使用(由浅入深)
热门文章
- 2022-2028年中国基因工程药物产业市场研究及前瞻分析报告
- GCC 编译 C++ 程序分步骤流程(预处理 gcc -E、编译 gcc -S、汇编 gcc -c 和链接 gcc 以及 gcc -o 选项)
- python技巧提升
- CMD 输入中文看不到输入法的解决方法
- ImportError: DLL load failed: 找不到指定的模块。 TensorFlow 1.13
- LeetCode简单题之两数之和 IV - 输入 BST
- CodeGen融合核心关系循环扩展
- RTOS诊断和错误检查
- YOLOv3和YOLOv4长篇核心综述(下)
- 2021年大数据ELK(二十七):数据可视化(Visualize)