经过灰度化、高斯滤波、二值化后得到大致轮廓,根据轮廓大小筛选部分干扰元素,尽可能只保留主要物体的轮廓。
(1)灰度化
图像灰度化是指将图像从彩色转换为灰度图像的过程。这通常是通过将每个像素的 RGB 值转换为单个灰度值来完成的。
灰度值通常是使用灰度转换公式将 RGB 值转换为单个数值的过程。常用的灰度转换公式如下:
灰度值 = 0.2989 * R + 0.5870 * G + 0.1140 * B
其中 R、G 和 B 分别是像素的红、绿、蓝分量的值。
(2)高斯滤波
高斯滤波是一种图像平滑处理方法,可以用来去除噪声或模糊图像。它通过在图像上应用一个高斯卷积核来实现这一目的。
高斯卷积核是一个二维矩阵,其中的每个元素都是高斯函数的权值。高斯函数有一个平均值,其中权值较高的元素位于平均值附近,而权值较低的元素位于平均值较远处。这意味着高斯滤波会让图像中邻近的像素有更大的贡献,而较远的像素则会有较小的贡献。
(3)二值化
图像二值化是指将图像转换为黑白图像的过程。这通常是通过将图像中的每个像素的灰度值转换为 0 或 255 来实现的。在二值图像中,像素值为 0 的像素被视为黑色,像素值为 255 的像素被视为白色。
from PIL import Image
import cv2
import numpy as np
prefix = r'D:\imgs\\'
img_name = '武器3.jpg'
if __name__ == "__main__":
# 读入图像
image = Image.open(prefix + img_name)
image = cv2.cvtColor(np.asarray(image), cv2.COLOR_RGB2BGR)
# 转换为灰度图
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 高斯滤波
blur = cv2.GaussianBlur(gray, (5, 5), 0)
# 二值化
ret, binary = cv2.threshold(blur, 127, 255, cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
for i in range(1, len(contours)):
if contours[i].size > 200:
cv2.drawContours(image, contours, i, (0, 0, 255), 3)
cv2.imshow('img', image)
cv2.waitKey(0)
cv2.destroyAllWindows()