注意:在这篇文章中,我们将仅使用灰度图像以使其易于理解。
图像可以被认为是值的矩阵,其中每个值代表像素的强度。图像格式主要分为三种类型:
滤镜是用于通过应用某些操作来修改图像的工具。过滤器是一个在图像上移动的矩阵(也称为内核),对其窗口内的像素值执行计算。我们将介绍两种常见类型的滤波器:均值滤波器和中值滤波器。
均值滤波器用于通过对窗口内的像素值进行平均来减少噪声。它将窗口中的中心像素替换为该窗口内所有像素值的平均值。 cv2.blur() 函数应用内核大小为 3x3 的均值滤波器,这意味着它会考虑每个像素周围的 3x3 像素窗口来计算平均值。这有助于平滑图像。
import cv2 import matplotlib.pyplot as plt image = cv2.imread('McLaren-720S-Price-1200x675.jpg', cv2.IMREAD_GRAYSCALE) # Applies a Mean Filter of size 3 x 3 blurred_image = cv2.blur(image, (3, 3)) plt.subplot(1, 2, 1) plt.imshow(image, cmap='gray') plt.title('Original Image') plt.axis("off") plt.subplot(1, 2, 2) plt.imshow(blurred_image, cmap='gray') plt.title('Mean Filtered Image') plt.axis("off") plt.show()
中值滤波器用于通过将每个像素的值替换为窗口中所有像素的中值来减少噪声。它对于消除椒盐噪声特别有效。 cv2.medianBlur() 函数应用内核大小为 3 的中值滤波器。此方法将每个像素替换为其邻域像素值的中值,这有助于在去除噪声的同时保留边缘。这里内核尺寸越大,图像越模糊。
import cv2 import matplotlib.pyplot as plt image = cv2.imread('McLaren-720S-Price-1200x675.jpg', cv2.IMREAD_GRAYSCALE) # Applies a Median Filter with a kernel size of 3 blurred_image = cv2.medianBlur(image, 3) plt.subplot(1, 2, 1) plt.imshow(image, cmap='gray') plt.title('Original Image') plt.axis("off") plt.subplot(1, 2, 2) plt.imshow(blurred_image, cmap='gray') plt.title('Median Filtered Image') plt.axis("off") plt.show()
您可以创建自定义过滤器以对图像应用特定操作。 cv2.filter2D() 函数允许您将任何自定义内核应用于图像。 cv2.filter2D() 函数将自定义内核(过滤器)应用于图像。内核是一个矩阵,定义对像素值执行的操作。在此示例中,内核根据指定的值增强图像的某些特征。
import cv2 import numpy as np import matplotlib.pyplot as plt image = cv2.imread('McLaren-720S-Price-1200x675.jpg', cv2.IMREAD_GRAYSCALE) # Define a custom filter kernel kernel = np.array([[2, -1, 5], [-5, 5, -1], [0, -1, 0]]) filtered_image = cv2.filter2D(image, -1, kernel) plt.subplot(1, 2, 1) plt.imshow(image, cmap='gray') plt.title('Original Image') plt.axis('off') plt.subplot(1, 2, 2) plt.imshow(filtered_image, cmap='gray') plt.title('Filtered Image') plt.axis('off') plt.show()
注意:在代码片段中,在分配阈值图像时,您将看到 _ ,图像。这是因为 cv2.threshold 函数返回两个值:使用的阈值和阈值化图像。由于我们只需要阈值图像,因此我们使用 _ 忽略阈值。
阈值处理通过根据条件设置像素值将图像转换为二值图像。有几种类型的阈值技术:
该方法为整个图像设置一个固定的阈值。值高于阈值的像素设置为最大值 (255),低于阈值的像素设置为 0。 cv2.threshold() 函数用于简单阈值处理。强度大于 127 的像素设置为白色 (255),强度小于或等于 127 的像素设置为黑色 (0),生成二值图像。
import cv2 import matplotlib.pyplot as plt image = cv2.imread('McLaren-720S-Price-1200x675.jpg', cv2.IMREAD_GRAYSCALE) _, thresholded_image = cv2.threshold(image, 127, 255, cv2.THRESH_BINARY) plt.subplot(1, 2, 1) plt.imshow(image, cmap='gray') plt.title('Original Image') plt.axis("off") plt.subplot(1, 2, 2) plt.imshow(thresholded_image, cmap='gray') plt.title('Thresholded Image') plt.axis("off") plt.show()
Otsu的方法根据图像的直方图自动确定最佳阈值。该方法最小化类内方差并最大化类间方差。通过将阈值设置为0并使用cv2.THRESH_OTSU,该函数会自动计算将前景与背景分开的最佳阈值。
import cv2 import matplotlib.pyplot as plt image = cv2.imread('McLaren-720S-Price-1200x675.jpg', cv2.IMREAD_GRAYSCALE) _, otsu_thresholded_image = cv2.threshold(image, 0, 255, cv2.THRESH_BINARY cv2.THRESH_OTSU) plt.subplot(1, 2, 1) plt.imshow(image, cmap='gray') plt.title('Original Image') plt.axis("off") plt.subplot(1, 2, 2) plt.imshow(otsu_thresholded_image, cmap='gray') plt.title("Otsu's Thresholded Image") plt.axis("off") plt.show()
在平均自适应阈值中,每个像素的阈值是根据该像素周围的局部邻域中的像素值的平均值来计算的。该方法在图像的不同区域动态调整阈值。 cv2.adaptiveThreshold() 函数根据局部 11x11 邻域中像素值的平均值计算每个像素的阈值。从此平均值中减去常数值 2 以微调阈值。此方法对于不同光照条件的图像有效。
import cv2 import matplotlib.pyplot as plt image = cv2.imread('McLaren-720S-Price-1200x675.jpg', cv2.IMREAD_GRAYSCALE) mean_adaptive_thresholded_image = cv2.adaptiveThreshold(image, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2) plt.subplot(1, 2, 1) plt.imshow(image, cmap='gray') plt.title('Original Image') plt.axis("off") plt.subplot(1, 2, 2) plt.imshow(mean_adaptive_thresholded_image, cmap='gray') plt.title('Mean Adaptive Thresholded Image') plt.axis("off") plt.show()
高斯自适应阈值根据局部邻域中像素值的高斯加权和计算每个像素的阈值。在照明不均匀的情况下,此方法通常可以提供更好的结果。在高斯自适应阈值中,阈值由 11x11 邻域中像素值的高斯加权和确定。从此加权平均值中减去常数值2来调整阈值。此方法对于处理具有不同光照和阴影的图像非常有用。
import cv2 import matplotlib.pyplot as plt image = cv2.imread('McLaren-720S-Price-1200x675.jpg', cv2.IMREAD_GRAYSCALE) gaussian_adaptive_thresholded_image = cv2.adaptiveThreshold(image, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2) plt.subplot(1, 2, 1) plt.imshow(image, cmap='gray') plt.title('Original Image') plt.axis("off") plt.subplot(1, 2, 2) plt.imshow(gaussian_adaptive_thresholded_image, cmap='gray') plt.title('Gaussian Adaptive Thresholded Image') plt.axis("off") plt.show()
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3