博纳网站建设,关键词seo资源,seo百度排名优化,挂甲寺网站建设第二章#xff1a;图像处理基础操作一、图像的基本表示方法#xff1a;1. 二值图像#xff1a;2. 灰度图像#xff1a;3. 彩色图像#xff1a;二、像素处理#xff1a;1. 二值图像及灰度图像#xff1a;2.彩色图像#xff1a;3. 使用numpy.array访问像素#xff1a;三…
第二章图像处理基础操作一、图像的基本表示方法1. 二值图像2. 灰度图像3. 彩色图像二、像素处理1. 二值图像及灰度图像2.彩色图像3. 使用numpy.array访问像素三、感兴趣区域(ROI):四、通道操作1. 通道拆分2. 通道合并五、获取图像属性本章主要介绍
图像的基本表示方法像素的访问和操作感兴趣区域的处理通道处理
等知识点。需要注意的是使用面向Python的OpenCV必须熟练掌握Numpy库尤其是Numpy.array库Numpy.array库是python处理图像的基础。
一、图像的基本表示方法
图像的基本表示方法有
二值图像灰度图像彩色图像
1. 二值图像
二值图像是指仅包含黑色和白色两种颜色的图像。
计算机中通过矩阵来表示和处理图像。例如下图一个A的图像计算机在处理该图像时会首先将其划分为一个个的小方块即像素点每一个像素点都是一个独立的处理单元。然后将其中白色的像素点置为1黑色的像素点置为0用于后续的存储和处理操作。 2. 灰度图像
二值图像表示起来简单方便但是因为其仅有黑白两种颜色所表示的图像不够细腻。如果需要表示更多的细节就需要使用更多的颜色。
例如下图的灰度图像
通常计算机会将灰度处理为256个灰度级用区间[0, 255]来表示。其中255表示纯白色0表示纯黑色其余的数值表示从纯白色到纯黑色之间前不同级别的灰度。
用于表示256个灰度级的数值0-255正好可以用一个字节(8个2进制位)来表示。如下图是部分二进制值所对应的十进制值 有些情况下也会使用8位二进制来表示一幅二值图像。这种情况下255表示白色0表示黑色图像中只存在255和0。
3. 彩色图像
相比二值图像和灰度图像彩色图像是更常见的一类图像。神经生理学实验发现在视网膜上存在三种不同的颜色感受器能够感受三种不同的颜色红色、绿色和蓝色即三基色。自然界中常见的各种色光都可以通过将三基色按照一定的比例混合构成。除此之外从光学角度出发可以将颜色解析为主波长、纯度、明度等。从心理学和视觉角度出发可以将颜色解析为色调、饱和度、亮度等。通常我们将上述方式采用不同的方式来表述颜色的模式称为色彩空间或者颜色空间、颜色模式。
虽然不同的色彩空间具有不同的表示方式但是各种色彩空间之间可以根据相应的公式进行转换。
例如在RGB色彩空间中存在R通道、G通道、B通道共三个通道。每个色彩通道值的方位都在[0, 255]之间。因此通常用一个三维数组来表示一幅RGB色彩空间的彩色图像。注意在OpenCV中通道的顺序是B-G-R。
二、像素处理
像素是图像构成的基本单位像素处理是图像处理的基本操作可以通过位置索引的形式对图像内的元素镜像访问、处理。
1. 二值图像及灰度图像
在OpenCV中最小的数据类型是无符号的8位数。因此在OpenCV中实际是并没有二值图像这种数据类型二值图像经常是通过处理得到的特殊的灰度图像使用0表示黑色使用255表示白色。
通过前面的分析可知在计算机中图像就是一个由像素点组成的矩阵。在面向Python 的OpenCV中图像就是Numpy中的数组。一个OpenCV灰度图像就是一个二维数组可以使用表达式访问其中的像素值。例如可以使用image[0, 0]访问图像image第0行第0列未知上的像素点。
示例: 读取一个灰度图像并对其像素进行访问、修改
import cv2
img cv2.imread(lena.bmp, 0)
cv2.imshow(before, img)
for i in range(10, 100):for j in range(80, 100):img[i, j] 255
cv2.imshow(after, img)
cv2.waitKey()
cv2.destroyAllWindows()2.彩色图像
RGB模式的彩色图像在读入到OpenCV中进行处理时会按照行方向依次读取该RGB图像的 B通道、G通道、R通道的像素点并将像素点以行为单位存储在ndarray的列中。例如有一幅大小为R行×C列的原始RGB图像其在OpenCV内衣BGR模式的三维数组形式存储。 可以使用表达式访问数组内的值。例如可以使用image[0, 0, 0] 访问图像image第0行第0列像素点的B通道。
第1个索引表示第0行第2个索引表示第0列第3个索引表示第0个颜色通道
示例 读取一幅彩色图像并对其像素进行访问、修改。
import cv2
img cv2.imread(lena512color.tiff)
cv2.imshow(before, img)
# 白色
for i in range(0, 50):for j in range(0, 100):for k in range(0, 3):img[i, j, k] 255
# 灰色
for i in range(50, 100):for j in range(0, 100):img[i, j] [128, 128, 128]
# 黑色
for i in range(100, 150):for j in range(0, 100):img[i, j] 0
cv2.imshow(after, img)
cv2.waitKey()
cv2.destroyAllWindows()3. 使用numpy.array访问像素
numpy.array提供了item()和itemset()行数来访问和修改像素值而且这两个函数都是经过优化处理的能够大幅度提高处理效率。在访问和修改像素点的值时利用numpy.array提供的函数要比直接使用索引快得多同时这两个函数的可读性也更好。 二值图像及灰度图像 可以将二值图像理解为特殊的灰度图像。 item()访问像素点语法item(行列)item()修改像素值语法itemset(索引值新值) 示例 读取一幅灰度图像并对其进行像素值访问及修改。 import cv2
img cv2.imread(../lena.bmp, 0)
print(读取像素点img.item(3, 2), img.item(3, 2))
img.itemset((3, 2), 255)
print(修改后像素点img.item(3, 2), img.item(3, 2))
cv2.imshow(before, img)
for i in range(10, 200):for j in range(80, 300):img.itemset((i, j), 255)
cv2.imshow(after, img)
cv2.waitKey()
cv2.destroyAllWindows()彩色图像 同样可以使用item()函数和itemset()函数来访问和修改彩色图像的像素值过程与操作灰度图像 相似。不同的是需要补充通道信息。 item()访问EGB模式图像的像素值。语法item(行列 通道) itemset()修改RGB模式图像像素值。语法itemset(三元组索引值新值) 需要注意针对RGB图像的访问必须同时指定行、列以及通道例如img.item(a, b, c)。仅指定行和列是不可以的。 示例 读取已否彩色图像并对其进行像素访问、修改 import cv2
img cv2.imread(lena512color.tiff)
cv2.imshow(before, img)
print(访问img.item(0, 0, 0) , img.item(0, 0, 0))
# 白色
for i in range(0, 50):for j in range(0, 100):for k in range(0, 3):img.itemset((i, j, k), 255)
cv2.imshow(after, img)
print(修改后端img.item(0, 0, 0) , img.item(0, 0, 0))
cv2.waitKey()
cv2.destroyAllWindows()在这里插入图片描述
访问img.item(0, 0, 0) 125 修改后端img.item(0, 0, 0) 255
三、感兴趣区域(ROI):
在图像处理过程中我们可能会对图像的摸一个特定区域感兴趣该区域被称为感兴趣区域ROI。在设定感兴趣区域ROI后就可以对该区域进行整体操作。例如将一个感兴趣区域A赋值给变量B后可以将该变量B赋值给另外一个区域C从而达到在区域C内复制区域A的目的。
示例1 假设当前图像名称为img图中的数字分别表示行号和列号。那么图像中的黑色ROI可以表示为img[200:400, 200:400] 通过一下语句能够将图中黑色ROI复制到该区域右侧
a img[200:400, 200:400]
img[200:400, 600:800] a 示例2 获取图像lena的脸部信息并将其显示出来。
import cv2
a cv2.imread(lena512color.tiff, cv2.IMREAD_UNCHANGED)
face a[220: 400, 250: 350]
cv2.imshow(original, a)
cv2.imshow(face, face)
cv2.waitKey()
cv2.destroyAllWindows()示例3 对lena图像脸部进行打码
import cv2
import numpy as np
a cv2.imread(../lena512color.tiff, cv2.IMREAD_UNCHANGED)
cv2.imshow(original, a)
face np.random.randint(0, 256, (180, 100, 3))
a[220: 400, 250: 350] face
cv2.imshow(result, a)
cv2.waitKey()
cv2.destroyAllWindows()四、通道操作
在RGB图像中图像由R通道、G通道、B通道三个通道构成的。需要注意的是在OpenCV中通道是按照B通道-G通道-R通道的顺序存储的。在图像处理过程中可以根据需要对图像进行通道拆分和通道合并。
1. 通道拆分
针对RGB图像可以分别拆分出其R通道、G通道、B通道。在OpenCV中即可以通过索引的方式拆分通道也可以通过函数的方式拆分通道。 通过索引拆分通道 通过索引的方式可以直接将各个通道从图像内提取出来。如针对OpneCV中的BGR图像img b img[ : , : , 0]g img[ : , : , 1]r img[ : , : , 2] 示例 编写程序演示图像通道才分及通道值变换对彩色图像的影响。 import cv2
lena cv2.imread(lena512color.tiff)
cv2.imshow(lena1, lena)
b lena[:, :, 0]
g lena[:, :, 1]
r lena[:, :, 2]
cv2.imshow(b, b)
cv2.imshow(g, g)
cv2.imshow(r, r)
lena[:, :, 0] 0
cv2.imshow(lenab0, lena)
lena[:, :, 1] 0
cv2.imshow(lenabogo, lena)
cv2.waitKey()
cv2.destroyAllWindows()通过函数拆分通道 函数cv2.split()能够拆分图像的通道。如可以使用以下语句拆分彩色BGR图像img得到图像的BGR通道。 b, g, r cv2.split(img) b cv2.split(img)[0] g cv2.split(img)[1] r cv2.split(img)[2] 示例 使用函数cv2.split()拆分图像通道 import cv2
lena cv2.imread(../lena512color.tiff)
b, g, r cv2.split(lena)
cv2.imshow(B, b)
cv2.imshow(G, g)
cv2.imshow(R, r)
cv2.waitKey()
cv2.destroyAllWindows()2. 通道合并
通道合并是通道拆分的逆过程通过合并通道可以将三个通道的灰度图像构成一幅彩色图像。函数cv2.merge()可以实现图像通道的合并如有B, G, R三个通道图像使用函数cv2.merge()将其合并为一幅BGR三通道的彩色图像。其实现语句为bgr_img cv2.merge([b, g, r])
示例 使用函数cv2.merge()合并通道。
import cv2
lena cv2.imread(../lena512color.tiff)
b, g, r cv2.split(lena)
bgr cv2.merge([b, g, r])
rgb cv2.merge([r, g, b])
cv2.imshow(lena, lena)
cv2.imshow(bar, bgr)
cv2.imshow(rgb, rgb)
cv2.waitKey()
cv2.destroyAllWindows() 五、获取图像属性
在图像处理过程中经常需要获取图像的属性如图像的大小、类型等。这里介绍几个常用的属性
shape如果是彩色图像则返回包含行数、列数、通道数的数组如果是二值图像或者灰度图像则仅返回行数和列数。通过该属性的返回值是否包含通道数可以判断图像是灰度图像还是彩色图像。size返回图像的像素数目。其值为行数×列数×通道数灰度图像挥着二值图像通道数为1dtype返回图像的数据类型
示例
import cv2
gray cv2.imread(../lena.bmp, 0)
color cv2.imread(../lena512color.tiff)
print(图像gray属性)
print(gray.shape, gray.shape)
print(gray.size, gray.size)
print(gray.dtype, gray.dtype)
print(图像color属性)
print(color.shape, color.shape)
print(color.size, color.size)
print(color.dtype, color.dtype)终端输出 图像gray属性 gray.shape (512, 512) gray.size 262144 gray.dtype uint8 图像color属性 color.shape (512, 512, 3) color.size 786432 color.dtype uint8
该文章内容参考总结自《OpenCV轻松入门》这本书详细内容可以参考这本书。