我在Vscode学OpenCV 处理图像

既然我们是面向Python的OpenCV(OpenCV for Python)那我们就必须要熟悉Numpy这个库,尤其是其中的数组的库,Python是没有数组的,唯有借助他库才有所实现想要的目的。

python 复制代码
# 老三样库--事先导入
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt

OpenCV处理图像

  • 二、图像的认识
    • 2.1图像的表示
    • [2.2 逐点处理(逐像素)并操作](#2.2 逐点处理(逐像素)并操作)
      • [2.2.1 灰度图像](#2.2.1 灰度图像)
        • (1)如何证明plt和cv2的的灰度图是一样的
        • [(2)避免错误:`TypeError: unsupported operand type(s) for -: 'AxesImage' and 'int'`](#(2)避免错误:TypeError: unsupported operand type(s) for -: 'AxesImage' and 'int')
        • [(3)plt就显示是正常的颜色。参数 cmap](#(3)plt就显示是正常的颜色。参数 cmap)
          • [`cmap` 是 Matplotlib 中的参数,用于指定颜色映射(Colormap),它决定了如何将数据值映射到颜色。Colormap 是一种颜色表,可以将数值数据映射到对应的颜色。它在绘制单通道图像或图表时非常有用,以帮助可视化数据。](#cmap 是 Matplotlib 中的参数,用于指定颜色映射(Colormap),它决定了如何将数据值映射到颜色。Colormap 是一种颜色表,可以将数值数据映射到对应的颜色。它在绘制单通道图像或图表时非常有用,以帮助可视化数据。)
        • (4)避免少cmap的参数出现的问题
        • (5)修改像素点
      • [2.2.2 彩色图像](#2.2.2 彩色图像)
      • [==2.2.3 感兴趣区域(ROI)【待处理】==](#==2.2.3 感兴趣区域(ROI)【待处理】==)
    • [2.3 图像的属性](#2.3 图像的属性)
    • [2.4 通道的操作](#2.4 通道的操作)
      • [2.4.1 cv2.split()能够拆分图像的通道](#2.4.1 cv2.split()能够拆分图像的通道)
      • [2.4.2 cv2.merge()可以实现图像通道的合并](#2.4.2 cv2.merge()可以实现图像通道的合并)
    • [2.5 色彩转变](#2.5 色彩转变)

二、图像的认识

2.1图像的表示

2.1.1 单通道__二值图像

二值图像是指仅仅包含黑色和白色两种颜色的图像。

白色像素点(白色小方块区域)处理为"1",将黑色像素点(黑色小方块区域)处理为"0",以方便进行后续的存储和处理等操作

例如:二维码和条形码就是简单的二值

2.1.2 单通道__灰度图像

二值图像表示起来简单方便,但是因为其仅有黑白两种颜色,所表示的图像不够细腻。如果想要表现更多的细节,就需要使用更多的颜色。能够表示的信息更多了

 256 个灰度级,用数值区间[0, 255]来表示,中,
 数值"255"表示纯白色,数值"0"表示纯黑色.
python 复制代码
# 处理图像
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt

img =np.zeros((256,256,3),np.uint8)
plt.imshow(img[:,:,::-1])
随机抓取一点看:
python 复制代码
x=np.random.randint(0,256)
y=np.random.randint(0,256)
img[x,y],x,y

再次随机

2.1.3 多通道__RGB彩色图像

自然界:红色、绿色和蓝色,即三基色(按照一定的比例混合构成。)

要区别于美术中的三原色:红黄蓝

色彩空间:

从光学角度出发可以将颜色解析为主波长,纯度,明度等,

从心理学角度和视觉角度出发可以将颜色解析为色调,饱和度,亮度等,我们将这些采用不同方式表达颜色的模式称为色彩空间。

RGB三个通道,每个通道取值[0,255]之间,组合表示颜色。共可以调配出所有常见的 256×256×256=16,777,216种颜色。

RGB=(R*65536)+(G*256)+B

以#FFF为例子

#FFF是#FFFFFF的简称

其他颜色

区别于OpenCV的通道

在RGB的色彩空间之中是以R,G,B的顺序存储的,然而在OpenCV中的通道是B,G,R

即:在处理图像的时候,需要对指定的图像通道顺序进行转换。除此以外,还可以根据需要对不同色彩空间的图像进行类型转换(灰度图像处理为二值图像,将彩色图像处理灰度图)

比方说,扫描二维码的时候,我们需要01的黑白画面就可以,不需要[0,255]的复杂

2.2 逐点处理(逐像素)并操作

像素的一格一格的小点来描述图像,现在有numpy和matplotlib.pyplot就相当于在二位的直角坐标系中的第二象限,就能够通过索引的形式对我们设定的图像或者导入的图像进行操作,访问。

python 复制代码
img[1,1]=(0,0,255)
plt.imshow(img[:,:,::-1])

2.2.1 灰度图像

首先使用 Numpy 库来生成一个 n×m 大小的数组,用来模拟一个黑色图像.

使用 Numpy 库中的函数 zeros()可以生成一个元素值都是 0 的数组
img=np.zeros((n,m),dtype=np.uint8

二维数组与图像之间存在对应关系。

(1)如何证明plt和cv2的的灰度图是一样的
python 复制代码
import cv2
import numpy as np
import matplotlib.pyplot as plt

# 读取图像
img = cv2.imread("./Pic/f2e919585490afd1bebd313257e7ad9.jpg", 0)

# # 使用cv2.imwrite将OpenCV数组图像保存为图像文件
# cv2.imwrite('./Pic/f2e919585490afd1bebd313257e7ad9.jpg', img)

# 如果你想要读取并显示保存后的图像,可以执行以下代码
saved_img = cv2.imread('./Pic/f2e919585490afd1bebd313257e7ad9.jpg', 0)
plt.imshow(saved_img, cmap='gray')
plt.title('Saved Image')
print(img==saved_img)
(2)避免错误:TypeError: unsupported operand type(s) for -: 'AxesImage' and 'int'

即:不可直接比较,需要将周图像的信息转换为数组的形式,一一对比。[轴图像无法和numpy数组]

轴图像转换为数组形式plt.imread或plt.imsave
python 复制代码
import matplotlib.pyplot as plt

# 读取Matplotlib图像并将其转换为数组
image_plt = plt.imread('your_image_path.jpg')

# 现在,image_plt是一个包含图像像素数据的NumPy数组
# 你可以对它进行处理或进行其他操作

或者,如果你要保存Matplotlib图像到文件中,你可以使用plt.imsave函数:

python 复制代码
import matplotlib.pyplot as plt

# 创建一个示例图像(这是一个例子,你可以替换它为你自己的图像数据)
image_data = ...  # 这里应该是一个NumPy数组

# 使用plt.imsave保存NumPy数组为图像文件
plt.imsave('output_image.jpg', image_data)

通过这两种方法,你可以在Matplotlib图像和NumPy数组之间进行相互转换。注意,如果你使用了一些Matplotlib特定的绘图函数来创建图像,你可以使用plt.gcf()获取当前的图形对象,然后使用savefig方法将其保存为图像文件。

(3)plt就显示是正常的颜色。参数 cmap

在使用 Matplotlib 绘制图像时,可以使用不同的 colormap(颜色映射)来表示单通道图像,例如使用 cmap='gray' 来显示灰度图像。对于四通道的图像,Matplotlib 也可以正确地显示透明度(Alpha)通道。

这是由于plt的映射到在灰度图像中,你只有一个通道,表示亮度值,但你可以使用不同的 Colormap 来表示这些亮度值。

cool 包含青绿色和品红色的阴影色。从青绿色平滑变化到品红色。

gray 返回线性灰度色图。

bone 具有较高的蓝色成分的灰度色图。该色图用于对灰度图添加电子的视图。

opencv是BGR通道,plt默认RGB通道,若使用cv2.imread()读入图像,用plt.imshow()展示原始图像或者展示对读入图像进行一系列操作后的图像时,需要进行通道转换。

显示灰度图像:

python 复制代码
import matplotlib.pyplot as plt
import cv2

# 读取灰度图像
gray_image = cv2.imread('gray_image.png', cv2.IMREAD_GRAYSCALE)

# 显示灰度图像
plt.imshow(gray_image, cmap='gray')
plt.show()

显示四通道图像(RGBA):

python 复制代码
import matplotlib.pyplot as plt
import cv2

# 读取四通道图像
rgba_image = cv2.imread('rgba_image.png', cv2.IMREAD_UNCHANGED)

# 显示四通道图像,包括透明度通道
plt.imshow(rgba_image)
plt.show()
cmap 是 Matplotlib 中的参数,用于指定颜色映射(Colormap),它决定了如何将数据值映射到颜色。Colormap 是一种颜色表,可以将数值数据映射到对应的颜色。它在绘制单通道图像或图表时非常有用,以帮助可视化数据。

Colormap 并不是通道的意思,而是指定如何将单一通道的数值映射到颜色的规则。在灰度图像中,你只有一个通道,表示亮度值,但你可以使用不同的 Colormap 来表示这些亮度值。

Matplotlib 提供了多种内置的 Colormap,一些常见的包括:

  1. 'viridis':从紫色到黄绿色的颜色映射,用于表示数据值的连续变化。
  2. 'jet':经典的彩虹颜色映射。
  3. 'gray':灰度颜色映射,用于表示单通道图像,将较暗的值映射为黑色,较亮的值映射为白色。
  4. 'copper':铜色颜色映射,常用于表示表面温度。

你可以在 Matplotlib 中使用 cmap 参数来指定所使用的颜色映射。例如:

python 复制代码
import matplotlib.pyplot as plt
import numpy as np

# 创建一个示例的单通道数据
data = np.random.random((10, 10))

# 使用'viridis' Colormap来绘制数据
plt.imshow(data, cmap='viridis')
plt.colorbar()  # 显示颜色条
plt.show()

这将使用 'viridis' Colormap 来表示数据中不同值的颜色。你可以根据你的需求选择合适的 Colormap 来更好地可视化你的数据。不同的 Colormap 可以传达不同的信息和情感。

(4)避免少cmap的参数出现的问题
python 复制代码
import cv2
import numpy as np
import matplotlib.pyplot as plt
img=np.ones((200,800,3),dtype=np.uint8)
img[:] = 255

cv2.imshow("this",img)
plt.imshow(img, cmap='gray')
cv2.waitKey(0)

cv2.destroyAllWindows()
img
(5)修改像素点

函数 item()能够更加高效地访问图像的像素点,该函数的语法格式为:

item(行,列)

函数 itemset()可以用来修改像素值,其语法格式为:

itemset(索引值,新值

python 复制代码
import numpy as np
img=np.random.randint(10,99,size=[5,5],dtype=np.uint8)
print("img=\n",img)
print("读取像素点 img.item(3,2)=",img.item(3,2))
img.itemset((3,2),255)
print("修改后 img=\n",img)
print("修改后像素点 img.item(3,2)=",img.item(3,2))

随机生成一张灰度图

python 复制代码
img=np.random.randint(0,256,size=[256,256],dtype=np.uint8)
cv2.imshow("demo",img)
 cv2.waitKey() 
 cv2.destroyAllWindows()

**

**

2.2.2 彩色图像

RGB 模式的彩色图像在读入 OpenCV 内进行处理时,会反向的读取图像像素BGR,并存储在ndarray中。其中的BGR为三维数组

python 复制代码
import numpy as np
import cv2
#-----------蓝色通道值--------------
blue=np.zeros((300,300,3),dtype=np.uint8)
blue[:,:,0]=255
print("blue=\n",blue)
cv2.imshow("blue",blue)
#-----------绿色通道值--------------
green=np.zeros((300,300,3),dtype=np.uint8)
green[:,:,1]=255
print("green=\n",green)
cv2.imshow("green",green)
#-----------红色通道值--------------
red=np.zeros((300,300,3),dtype=np.uint8)
red[:,:,2]=255
print("red=\n",red)
cv2.imshow("red",red)
#-----------释放窗口--------------
cv2.waitKey()
cv2.destroyAllWindows()
修改像素点

函数 item()访问 RGB 模式图像的像素值时,其语法格式为:

item(行,列,通道)

函数 itemset()修改(设置)RGB 模式图像的像素值时,其语法格式为:

itemset(三元组索引值,新值)

需要注意,针对 RGB 图像的访问,必须同时指定行、列以及行列索引(通道),例如

img.item(a,b,c)。仅仅指定行和列是不可以的

python 复制代码
import numpy as np
img=np.random.randint(10,99,size=[2,4,3],dtype=np.uint8)
print("img=\n",img)
print("读取像素点 img[1,2,0]=",img.item(1,2,0))
print("读取像素点 img[0,2,1]=",img.item(0,2,1))
print("读取像素点 img[1,0,2]=",img.item(1,0,2))
img.itemset((1,2,0),255)
img.itemset((0,2,1),255)
img.itemset((1,0,2),255)
print("修改后 img=\n",img)
第 2 章 图像处理基础
27
print("修改后像素点 img[1,2,0]=",img.item(1,2,0))
print("修改后像素点 img[0,2,1]=",img.item(0,2,1))
print("修改后像素点 img[1,0,2]=",img.item(1,0,2))

生成一幅彩色图像,让其中的像素值均为随机数。 根据题目要求,编写代码如下: import cv2

python 复制代码
import numpy as np
> img=np.random.randint(0,256,size=[256,256,3],dtype=np.uint8)
> cv2.imshow("demo",img)
> cv2.waitKey()
> cv2.destroyAllWindows()

2.2.3 感兴趣区域(ROI)【待处理】

ROI(region of interest),感兴趣区域。机器视觉、图像处理中,从被处理的图像以方框、圆、椭圆、不规则多边形等方式勾勒出需要处理的区域,称为感兴趣区域,ROI。在Halcon、OpenCV、Matlab等机器视觉软件上常用到各种算子(Operator)和函数来求得感兴趣区域ROI,并进行图像的下一步处理。

2.3 图像的属性

图像的属性

属性--- API

形状 img.shape

图像大小 img.size

数据类型 img.dtype

 shape:如果是彩色图像,则返回包含行数、列数、通道数的数组;如果是二值图像或者灰度图像,则仅返回行数和列数。通过该属性的返回值是否包含通道数,可以判断一幅图像是灰度图像(或二值图像)还是彩色图像。

 size:返回图像的像素数目。其值为"行×列×通道数",灰度图像或者二值图像的通道数为 1。

 dtype:返回图像的数据类型

2.4 通道的操作

针对 OpenCV 内的 BGR

图像 img,如下语句分别从中提取了 B 通道、G 通道、R 通道。

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

2.4.1 cv2.split()能够拆分图像的通道

python 复制代码
b,g,r=cv2.split(img)
python 复制代码
#通道拆分
b,g,r=cv.split(newimg)
拆分后就是单通道,需要灰度图

plt.imshow(b,cmap=plt.cm.gray)

2.4.2 cv2.merge()可以实现图像通道的合并

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

2.5 色彩转变

2.5.1 色彩空间转换

python 复制代码
gray=cv.cvtColor(newimg,cv.COLOR_BGR2GRAY)
# plt.imshow(gray)

要以灰度图显示

python 复制代码
plt.imshow(gray,cmap=plt.cm.gray)
转换为HSV
python 复制代码
hsv=cv.cvtColor(newimg,cv.COLOR_BGR2HSV)
plt.imshow(hsv)
相关推荐
刽子手发艺14 分钟前
Selenium+OpenCV处理滑块验证问题
opencv·selenium·webpack
罗政6 小时前
冒险岛079 V8 整合版源码搭建教程+IDEA启动
java·ide·intellij-idea
艾斯比的日常8 小时前
VSCode 实用快捷键
ide·vscode·编辑器
Galaxy_12298 小时前
vscode远程报错:Remote host key has changed,...
ide·vscode·编辑器
彬sir哥8 小时前
VScode运行后出现黑窗口
vscode·运行·黑窗口
Hi~晴天大圣13 小时前
Pycharm中断点使用技巧
ide·python·pycharm
且随疾风前行.14 小时前
Android Studio 提示 !Failed to initialize editor
android·ide·android studio
比牛顿更懂PID15 小时前
VSCode本地python包“无法解析导入”
ide·vscode·python
qxyywy17 小时前
CUDA 安装 一直卡在Installing Nsight Visual Studio Edition
ide·visual studio·cuda
AI浩18 小时前
基于暗通道先验的图像去雾算法解析与实现
人工智能·opencv·算法