图像处理篇---基本Python图像处理
文章目录
- 前言
- 1. 图像灰度化
- 原理
- Python 实现
- 2. 图像二值化
- 原理:
- Python 实现
- 3. 图像掩膜(Mask)
- 原理
- Python 实现
- 4. 腐蚀(Erosion)和膨胀(Dilation)
- 原理
- Python 实现
- 5. 其他常用图像操作
- (1) 图像缩放
- (2) 图像旋转
- (3) 图像平滑(模糊)
- (4) 边缘检测(Canny)
- (5) 轮廓检测
- 6. 总结
- 总结
前言
以上就是今天要讲的内容,本文仅仅简单介绍了基本Python图像处理:灰度化、二值化、掩码、腐蚀膨胀、缩放、旋转、高斯平滑、边缘检测、轮廓检测。
1. 图像灰度化
灰度化是将彩色图像转换为灰度图像的过程。灰度图像只有一个通道,每个像素的值表示亮度(0 为黑色,255 为白色)。
原理
将彩色图像的 RGB 通道转换为灰度值,常用的公式为:
Gray=0.299×R+0.587×G+0.114×B
Python 实现
import cv2
#读取彩色图像
image = cv2.imread("image.jpg")
#灰度化
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
#显示结果
cv2.imshow("Gray Image", gray_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
2. 图像二值化
二值化是将灰度图像转换为黑白图像的过程。通过设定一个阈值,将像素值分为两类(0 或 255)。
原理:
设定一个阈值 T,将像素值 x 转换为:
𝑥={255 if 𝑥≥𝑇 ;0 if 𝑥<𝑇}
Python 实现
import cv2
#读取灰度图像
gray_image = cv2.imread("image.jpg", cv2.IMREAD_GRAYSCALE)
#二值化
_, binary_image = cv2.threshold(gray_image, 127, 255, cv2.THRESH_BINARY)
#显示结果
cv2.imshow("Binary Image", binary_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
3. 图像掩膜(Mask)
掩膜是通过一个二值图像(掩膜)提取原图像中感兴趣区域的操作。
原理
掩膜是一个二值图像,白色区域(255)表示保留的区域,黑色区域(0)表示忽略的区域。
通过按位与操作,将掩膜应用到原图像上。
Python 实现
import cv2
import numpy as np
#读取图像
image = cv2.imread("image.jpg")
#创建掩膜(白色区域为感兴趣区域)
mask = np.zeros(image.shape[:2], dtype=np.uint8)
cv2.rectangle(mask, (100, 100), (300, 300), 255, -1) # 在掩膜上绘制白色矩形
mask = np.zeros(image.shape[:2], dtype=np.uint8)
np.zeros(…): 这是一个NumPy函数,用于创建一个指定形状和数据类型的新数组,并将其所有元素初始化为0。
image.shape[:2]: image 是一个已经存在的图像变量,它有一个属性 shape,这个属性是一个元组,表示图像的维度。在灰度图像或RGB图像的情况下,shape 会返回一个元组,如 (高度, 宽度, 颜色通道数)。通过 image.shape[:2],我们只取这个元组的前两个元素,即图像的高度和宽度,这样就可以创建一个与图像同样大小的二维数组。
dtype=np.uint8: 这里指定了数组的数据类型为 np.uint8,即8位无符号整数,取值范围为0到255。这是图像处理中常用的数据类型,因为每个像素的颜色值通常用0到255的整数表示。
这条语句的结果是创建了一个与输入图像 image 的高度和宽度相同,但只有一个颜色通道(即二维)的数组 mask,该数组的所有元素都是0。
cv2.rectangle(mask, (100, 100), (300, 300), 255, -1)
cv2.rectangle(…): 这是OpenCV库中的一个函数,用于在图像上绘制矩形。
mask: 这是第一个参数,表示要在其上绘制矩形的图像。在这个例子中,我们在之前创建的 mask 数组上绘制矩形。
(100, 100): 这是矩形的起始坐标点(左上角)。在这个例子中,矩形的左上角位于图像的(100, 100)位置。
(300, 300): 这是矩形的结束坐标点(右下角)。矩形的右下角位于图像的(300, 300)位置。
255: 这是矩形内部的颜色值。由于 mask 是一个uint8类型的数组,颜色值255表示白色。
-1: 这个参数表示矩形边框的粗细。如果这个值是负数,OpenCV会填充整个矩形为指定的颜色(在这里是白色)。如果这个值是正数或0,它将定义矩形边框的宽度。
这条语句的结果是在 mask 数组上绘制了一个白色矩形,其左上角位于(100, 100),右下角位于(300, 300)。由于使用了 -1 作为边框粗细的值,矩形内部被完全填充为白色(255),而矩形外部仍然是黑色(0)。这个 mask 可以用于图像处理中的各种操作,比如选择图像的某个区域进行进一步处理。
#应用掩膜
masked_image = cv2.bitwise_and(image, image, mask=mask)
#显示结果
cv2.imshow("Masked Image", masked_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
4. 腐蚀(Erosion)和膨胀(Dilation)
腐蚀和膨胀是形态学操作,用于处理二值图像中的前景对象。
原理
腐蚀:用**结构元素(kernel)**扫描图像,如果结构元素覆盖的区域全是前景(255),则保留中心像素,否则置为 0。
膨胀:用结构元素扫描图像,如果结构元素覆盖的区域有至少一个前景(255),则置中心像素为 255。
Python 实现
import cv2
import numpy as np
#读取二值图像
binary_image = cv2.imread("binary_image.jpg", cv2.IMREAD_GRAYSCALE)
#定义结构元素(kernel)
kernel = np.ones((5, 5), np.uint8)
#腐蚀
eroded_image = cv2.erode(binary_image, kernel, iterations=1)
#膨胀
dilated_image = cv2.dilate(binary_image, kernel, iterations=1)
#显示结果
cv2.imshow("Eroded Image", eroded_image)
cv2.imshow("Dilated Image", dilated_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
5. 其他常用图像操作
(1) 图像缩放
resized_image = cv2.resize(image, (new_width, new_height))
(2) 图像旋转
(h, w) = image.shape[:2]
center = (w // 2, h // 2)
matrix = cv2.getRotationMatrix2D(center, angle, scale) # angle: 旋转角度, scale: 缩放比例
rotated_image = cv2.warpAffine(image, matrix, (w, h))
(3) 图像平滑(模糊)
blurred_image = cv2.GaussianBlur(image, (kernel_size, kernel_size), 0)
(4) 边缘检测(Canny)
edges = cv2.Canny(image, threshold1, threshold2) # threshold1 和 threshold2 是阈值
edges: 这是一个新的图像变量,它将存储边缘检测的结果。edges 图像将是一个二值图像,其中边缘位置以白色(像素值为255)表示,非边缘位置以黑色(像素值为0)表示。
cv2.Canny(…): 这是 OpenCV 中的 Canny 边缘检测函数,用于检测图像中的边缘。
image: 这是输入图像,可以是灰度图像或者彩色图像。如果输入是彩色图像,通常在应用 Canny 函数之前将其转换为灰度图像,因为边缘检测通常在灰度空间中进行。
threshold1: 这是第一个阈值参数,用于边缘连接。较小的阈值 threshold1 用于检测图像中的强边缘。
threshold2: 这是第二个阈值参数,用于边缘连接。较大的阈值 threshold2 用于检测图像中的弱边缘。
Canny 边缘检测算法的工作原理如下:
降噪:通常在进行边缘检测之前,会先对图像进行降噪处理,比如使用高斯模糊来减少图像噪声的影响。
计算梯度:算法计算图像中每个像素点的梯度大小和方向。梯度的大小表示边缘的强度,而方向表示边缘的方向。
非极大值抑制:在计算梯度后,算法会应用非极大值抑制,以细化边缘。这意味着只有梯度强度在特定方向上是局部最大值的像素点才会被考虑为边缘。
双阈值:在这一步,会使用两个阈值(threshold1 和 threshold2)来确定哪些边缘是“真正”的边缘。梯度强度高于 threshold2 的像素点被标记为强边缘,梯度强度低于 threshold1 的像素点被抑制(即不是边缘)。位于这两个阈值之间的像素点,如果它们与强边缘相连,则会被标记为弱边缘。
边缘跟踪和连接:最后,算法会跟踪弱边缘,并将它们连接到强边缘上,以形成完整的边缘。
通过调整 threshold1 和 threshold2 的值,可以控制边缘检测的灵敏度。较小的 threshold1 值和较大的 threshold2 值可以检测到更多的边缘,但可能会增加噪声;而较大的 threshold1 值和较小的 threshold2 值可能会错过一些边缘,但会减少噪声的影响。
因此,edges = cv2.Canny(image, threshold1, threshold2) 这条语句的目的是在输入图像 image 上应用 Canny 边缘检测算法,并使用 threshold1 和 threshold2 作为边缘检测的阈值,最终将检测到的边缘存储在 edges 图像变量中。
(5) 轮廓检测
contours, _ = cv2.findContours(binary_image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
contour_image = cv2.drawContours(image.copy(), contours, -1, (0, 255, 0), 2)
6. 总结
- 灰度化:将彩色图像转换为灰度图像。
- 二值化:将灰度图像转换为黑白图像。
- 掩膜:提取图像中的感兴趣区域。
- 腐蚀和膨胀:形态学操作,用于处理二值图像。
- 其他操作:缩放、旋转、平滑、边缘检测、轮廓检测等。
通过 OpenCV 和 NumPy,可以轻松实现这些图像处理操作。
总结
以上就是今天要讲的内容,本文仅仅简单介绍了基本Python图像处理:灰度化、二值化、掩码、腐蚀膨胀、缩放、旋转、高斯平滑、边缘检测、轮廓检测。