关于Python的环境安装还有库导入可以参考这篇公众号

人工智能导论(1)——Python环境安装与基础编程

本期我们要实现的内容是:

(1)使用canny边缘检测算法提取花朵轮廓;

(2)计算图像直方图,使用阈值分割法对花朵区域进行分割,并提取花朵轮廓;

(3)计算出花朵轮廓图的Hu矩;

打开PyCharm在安装库的界面搜索opencv-python,安装Python的Opencv库。

import cv2
import numpy as np

导入opencv库以及运算工具库。

我们利用opencv的自带库来进行Canny算法。

import cv2
import numpy as np

# 读取图像
img = cv2.imread('C:/Users/13256/Desktop/1.bmp', 0)  # 读取灰度图像
# 使用Canny算法进行边缘检测
edges = cv2.Canny(img, 50, 150)  # 50和150是Canny算法的低阈值和高阈值
# 显示原始图像和边缘检测结果
cv2.imshow('原始 Image', img)
cv2.imshow('Canny Edges', edges)
cv2.waitKey(0) #任意键推出
cv2.destroyAllWindows()

运行代码可以看效果

可以看到效果显著。

(2)计算图像直方图,使用阈值分割法对花朵区域进行分割,并提取花朵轮廓;

import cv2
import numpy as np
# 读取图像
img = cv2.imread('C:/Users/13256/Desktop/5.jpg')

# 转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 计算直方图
hist = cv2.calcHist([gray], [0], None, [256], [0, 256])

# 选择适当的阈值进行分割
_, thresholded = cv2.threshold(gray, 70, 256, cv2.THRESH_BINARY)

# 查找轮廓
contours, _ = cv2.findContours(thresholded, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# 绘制轮廓
result = img.copy()
cv2.drawContours(result, contours, -1, (0, 255, 0), 2)

# 显示图像和结果
cv2.imshow('yuanshi Image', img)
cv2.imshow('yuzhi Image', thresholded)
cv2.imshow('Contours', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

(3)计算出花朵轮廓图的Hu矩;

Hu矩(Hu Moments)是一组用于描述图像形状的特征矩。这些矩是从图像的原始矩(Moments)计算而来的,通过对图像的几何形状进行建模,可以用于表征图像的整体形状特征。

Hu矩的主要优点是它们对于图像的旋转、缩放和平移具有不变性,这使得它们在图像识别和模式匹配中非常有用。

共有七个Hu矩,称为Hu1至Hu7。这些矩可以通过计算图像的中心矩(central moments)和规范化中心矩(normalized central moments)得到。Hu矩的计算公式较为复杂,但它们的主要思想是通过对图像的几何形状特征进行标准化,使得这些特征对于缩放、旋转和平移不敏感。

在OpenCV中,可以使用cv2.HuMoments()函数来计算图像的Hu矩。这些矩以一维数组的形式返回,其中包含Hu1至Hu7的值。

在绘制Hu矩的时候 需要我们多导入一个库: matplotlib来绘制我们的Hu图像。

import cv2
import numpy as np
import matplotlib.pyplot as plt
# 读取图像
img = cv2.imread('C:/Users/13256/Desktop/5.jpg', cv2.IMREAD_GRAYSCALE)
# 选择适当的阈值进行分割
_, thresholded = cv2.threshold(img, 70, 255, cv2.THRESH_BINARY)
# 查找轮廓
contours, _ = cv2.findContours(thresholded, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# 筛选出面积较大的轮廓
filtered_contours = [cnt for cnt in contours if cv2.contourArea(cnt) > 100]

# 初始化一个数组来保存Hu矩的值
hu_values = []

# 遍历筛选后的轮廓并计算Hu矩
for contour in filtered_contours:
    hu_moments = cv2.HuMoments(cv2.moments(contour)).flatten()
    hu_values.append(hu_moments)
# 将Hu值打印成直方图
hu_values = np.array(hu_values)
num_hu_moments = hu_values.shape[1]
plt.figure(figsize=(10, 6))
for i in range(num_hu_moments):
    plt.subplot(2, 4, i + 1)
    plt.hist(hu_values[:, i], bins=20, color='blue', alpha=0.7)
    plt.title(f'Hu{i + 1}')
    plt.grid(True)
plt.tight_layout()
plt.show()

#读取灰度图像#
#50和150是Canny算法的低阈值和高阈值#
嘉立创PCB

还没有评论,抢个沙发!