opencv初步学习——图像处理2

这一部分主要讲解如何初步地创建一个图像,以及彩色图像我们的一些基本处理方法

一、创建一个灰度图像

1-1、zeros()函数 [NumPy库]

要用到这一个函数,首先我们需要调用我们的NumPy库,这一个函数的作用是可以帮助我们生成一个元素值都是0的二维数组,如果我们把这些数据放到一张图片里面去,那么就对应着我们的一个黑色图像。当然我们也可以通过修改数组中的数字大小来改变图像的颜色(但还是灰度图像)

(1)构成

该函数的具体构成如下:

python 复制代码
numpy.zeros(shape, dtype=float, order='C')  

shape:即我们需要设置的二维数组(元组或者列表)的大小

dtype:即我们需要设置的元组里面的数据的类型,一般默认为float;当然我们也可以变为其他(比如我们的int,bool);当然实际在写的时候可以不写dtype = ~~

order:这个跟存储有关,暂且不做介绍(因为我也不知道哈)


1-2、生成

(1)正确示范:

python 复制代码
import cv2
import numpy as np

img = np.zeros((80,80),dtype=np.uint8)

img[40,40] = 255

cv2.imshow("one",img)
cv2.waitKey()
cv2.destroyAllWindows()

于是我们生成的图像如下:

可以看到我们在中间修改成了一个白点

此外我们也可以使用切片来帮助我们更好地进行操作

(2)可能会错误的操作

1、没有 np. 前缀

这个现象代码如下:

python 复制代码
img = np.zeros((80,80),uint8)

为什么直接写uint8不可以呢,因为python里面是没有内置这些数据类型的,这些数据类型只在NumPy里面有,所以如果我们想要去引用这些数据类型我们需要加上我们的np.前缀:(前面已经设置NumPy为np了)

python 复制代码
img = np.zeros((80,80),np.uint8)
2、直接使用int

这个现象的代码如下:

python 复制代码
img = np.zeros((80,80,80),dtype=int)

在 NumPy 里,int一般是指 np.int32 或者 np.int64(这取决于你的系统),不过 OpenCV 的 cv2.imshow 函数不支持 CV_32S(32 位有符号整数)这类数据类型用于图像显示。此函数要求输入的图像数据类型为 CV_8U(8 位无符号整数),也就是 np.uint8 类型。



二、彩色图像的简单处理

1-1、基础知识

在opencv中的彩色图像是以BGR模式的三维数组的形式进行存储的,例如:

python 复制代码
img = [0,0,0]

第一个0指第0行;第二个0指0列;第三个0指的是第0个颜色通道(B,蓝色)

0、1、2分别对应BGR(蓝色、绿色、红色)


1-2、简单的颜色修改

例如我们现在还是采用如下图片:

我们可以进行如下操作:

python 复制代码
import cv2
img = cv2.imread("D:\\photo\\mountain.png")

img[300:440 , 0:100 , 0:3] = 255

cv2.imshow("one",img)
cv2.waitKey()
cv2.destroyAllWindows()

由于我们现在是彩色图像采取的是BGR三通道,那么我们这里的操作就是把300行到440行,0列到100列的三个通道全部设置为255,即我们的每个像素点的三个通道的值为(255,255,255),那么就会变成白色。具体显示出来的结果如下;

当然我们还可以这么处理:

python 复制代码
import cv2
img = cv2.imread("D:\\photo\\mountain.png")

img[300:440 , 0:100 ] = (0,0,255)
img[300:440 , 100:200 ] = (0,255,0)
img[300:440 , 200:300 ] = (255,0,0)

cv2.imshow("one",img)
cv2.waitKey()
cv2.destroyAllWindows()

这样即对每一个在我们指定区域的像素点的BGR通道进行修改,结果如下:

总结:在彩色图像中,每一个像素点都有三个通道(BGR)


1-3、通道处理

(1)通道拆分

在我们的opencv中,我们可以通过索引把我们的三个通道全部提取出来:

python 复制代码
b = img[:,:,0]
g = img[:,:,1]
r = img[:,:,2]

此时如果我们再去用cv2.imshow()函数将其展现出来,得到的是灰度图像,因为此时你的b、g、r中的数据只是单个通道的数据了,而不是三个通道了,这里我们就不过多地去展示。

除了使用索引去拆分,我们还可以通过如下方式去拆分:

python 复制代码
b,g,r = cv2.split(img)  这里直接分配了

(2)通道合并

既然我们可以拆分,那么我们也肯定可以合并,我们需要用到这个函数:

python 复制代码
cv2.merge([b,g,r])

正如上所示,你只需要将每个通道按照上面的形式摆放就可以了,当然你也不排除你把它的顺序搞反了,那么我们就很难绷了

相关推荐
傻啦嘿哟42 分钟前
Python SQLite模块:轻量级数据库的实战指南
数据库·python·sqlite
Q_Q5110082851 小时前
python+django/flask+uniapp基于微信小程序的瑜伽体验课预约系统
spring boot·python·django·flask·uni-app·node.js·php
XueminXu1 小时前
Python读取MongoDB的JSON字典和列表对象转为字符串
python·mongodb·json·pymongo·mongoclient·isinstance·json.dumps
techdashen1 小时前
12分钟讲解Python核心理念
开发语言·python
jie*1 小时前
小杰机器学习(nine)——支持向量机
人工智能·python·机器学习·支持向量机·回归·聚类·sklearn
闭着眼睛学算法1 小时前
【华为OD机考正在更新】2025年双机位A卷真题【完全原创题解 | 详细考点分类 | 不断更新题目 | 六种主流语言Py+Java+Cpp+C+Js+Go】
java·c语言·javascript·c++·python·算法·华为od
山烛1 小时前
OpenCV:人脸检测,Haar 级联分类器原理
人工智能·opencv·计算机视觉·人脸检测·harr级联分类器
郝学胜-神的一滴1 小时前
谨慎地迭代函数所收到的参数 (Effective Python 第31条)
开发语言·python·程序人生·软件工程
Coovally AI模型快速验证2 小时前
从避障到实时建图:机器学习如何让无人机更智能、更安全、更实用(附微型机载演示示例)
人工智能·深度学习·神经网络·学习·安全·机器学习·无人机
没有梦想的咸鱼185-1037-16632 小时前
【遥感技术】从CNN到Transformer:基于PyTorch的遥感影像、无人机影像的地物分类、目标检测、语义分割和点云分类
pytorch·python·深度学习·机器学习·数据分析·cnn·transformer