用python实现基于概率分布的超声图像与自然图像性质差异分析这一课题,使用opencv, 两种图像的文件类型都是jpg,超声图像的文件路径是‘D:\zzz\us5’,自然图像的文件路径是‘D:\zzz\na4’,两种图像都有84张,图像的名称都是1到84的顺序数,两种图像的形状大小相同,需要对比两种图像的特征必须有颜色,纹理,形态学特征,差异性分析方法也需要多种,包括完整详细代码
时间: 2023-11-16 08:05:32 浏览: 163
以下是实现基于概率分布的超声图像与自然图像性质差异分析的Python代码:
```python
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 定义函数获取图像特征
def get_features(img):
# 获取图像的颜色直方图
color_hist = cv2.calcHist([img], [0, 1, 2], None, [8, 8, 8], [0, 256, 0, 256, 0, 256])
# 归一化直方图
color_hist = cv2.normalize(color_hist, color_hist).flatten()
# 获取图像的灰度共生矩阵
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
glcm = cv2.calcGLCM(gray, [1], [0, np.pi/4, np.pi/2, 3*np.pi/4], symmetric=True)
# 计算灰度共生矩阵的对比度、能量、熵和相关性
contrast = cv2.compareHist(glcm[0], np.zeros_like(glcm[0]), cv2.HISTCMP_BHATTACHARYYA)
energy = cv2.compareHist(glcm[1], np.zeros_like(glcm[1]), cv2.HISTCMP_BHATTACHARYYA)
entropy = -np.sum(glcm[2] * np.log2(glcm[2] + 1e-10))
correlation = cv2.compareHist(glcm[3], np.zeros_like(glcm[3]), cv2.HISTCMP_BHATTACHARYYA)
# 获取图像的形态学特征
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
_, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))
opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=2)
area = np.sum(opening == 255)
perimeter = cv2.arcLength(cv2.findContours(opening, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0][0], True)
# 返回图像的特征向量
return np.concatenate(([color_hist, contrast, energy, entropy, correlation], [area, perimeter]))
# 定义函数获取图像数据集的特征矩阵
def get_feature_matrix(file_path):
feature_matrix = []
for i in range(1, 85):
img_path = file_path + '/' + str(i) + '.jpg'
img = cv2.imread(img_path)
feature_vector = get_features(img)
feature_matrix.append(feature_vector)
return np.array(feature_matrix)
# 获取超声图像和自然图像数据集的特征矩阵
us_feature_matrix = get_feature_matrix('D:/zzz/us5')
na_feature_matrix = get_feature_matrix('D:/zzz/na4')
# 定义函数计算两个数据集之间的KL散度
def kl_divergence(p, q):
return np.sum(np.where(p != 0, p * np.log(p / q), 0))
# 计算超声图像和自然图像数据集之间的KL散度
kl_divergences = []
for i in range(len(us_feature_matrix)):
kl_divergence_i = kl_divergence(us_feature_matrix[i], na_feature_matrix[i])
kl_divergences.append(kl_divergence_i)
# 绘制KL散度直方图
plt.hist(kl_divergences, bins=20)
plt.title('KL Divergence between Ultrasound and Natural Images')
plt.xlabel('KL Divergence')
plt.ylabel('Frequency')
plt.show()
```
代码解释:
- `get_features` 函数用于获取图像的特征向量,包括颜色直方图、灰度共生矩阵的对比度、能量、熵和相关性,以及形态学特征的面积和周长。
- `get_feature_matrix` 函数用于获取数据集的特征矩阵,其中每一行表示一个图像的特征向量。
- `kl_divergence` 函数用于计算两个概率分布之间的KL散度。
- `kl_divergences` 列表存储了所有超声图像和自然图像数据集之间的KL散度。
- `plt.hist` 函数用于绘制KL散度直方图。
注意事项:
- 代码中使用了OpenCV库来计算图像的颜色直方图、灰度共生矩阵和形态学特征,因此需要先安装OpenCV库。
- 代码中使用了Matplotlib库来绘制直方图,因此需要先安装Matplotlib库。
阅读全文