用python实现基于概率分布的超声图像与自然图像性质差异分析这一课题,使用opencv, 两种图像的文件类型都是jpg,超声图像的文件路径是‘D:\zzz\us5’,自然图像的文件路径是‘D:\zzz\na4’,两种图像都有84张,图像的名称都是1到84的顺序数,两种图像的形状大小相同,需要对比两种图像的特征必须有颜色,纹理,形态学特征,差异性分析方法也需要多种,包括完整详细代码
时间: 2023-11-16 17:05:32 浏览: 80
本题需要用到以下库:
- OpenCV (用于读取和处理图像)
- NumPy (用于数值计算)
- Matplotlib (用于图像显示)
- Scikit-image (用于计算图像特征)
首先,我们需要安装这些库。可以使用以下命令:
```
pip install opencv-python numpy matplotlib scikit-image
```
接下来,我们将编写代码来实现这个任务。
```python
import cv2
import numpy as np
from skimage.feature import greycomatrix, greycoprops
from matplotlib import pyplot as plt
# 定义两种图像的文件路径
us_path = "D:/zzz/us5/"
na_path = "D:/zzz/na4/"
# 定义一些用于计算纹理特征的参数
distances = [1, 2, 3]
angles = [0, np.pi/4, np.pi/2, 3*np.pi/4]
# 定义一个函数,用于计算图像的纹理特征
def compute_texture_features(img):
# 将图像转换为灰度图
grey = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 计算灰度共生矩阵
glcm = greycomatrix(grey, distances=distances, angles=angles, symmetric=True, normed=True)
# 计算纹理特征
contrast = greycoprops(glcm, 'contrast').ravel()
dissimilarity = greycoprops(glcm, 'dissimilarity').ravel()
homogeneity = greycoprops(glcm, 'homogeneity').ravel()
energy = greycoprops(glcm, 'energy').ravel()
correlation = greycoprops(glcm, 'correlation').ravel()
asm = greycoprops(glcm, 'ASM').ravel()
# 将所有特征组合成一个向量
features = np.hstack([contrast, dissimilarity, homogeneity, energy, correlation, asm])
return features
# 定义一个函数,用于计算图像的形态学特征
def compute_morphological_features(img):
# 将图像转换为灰度图
grey = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 计算二值化图像
_, binary = cv2.threshold(grey, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)
# 计算轮廓
contours, _ = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 计算形态学特征
area = cv2.contourArea(contours[0])
perimeter = cv2.arcLength(contours[0], True)
# 返回特征向量
return np.array([area, perimeter])
# 定义一个函数,用于计算图像的颜色特征
def compute_color_features(img):
# 将图像转换为HSV颜色空间
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# 计算颜色直方图
hist = cv2.calcHist([hsv], [0, 1], None, [12, 3], [0, 180, 0, 256])
# 将直方图归一化
cv2.normalize(hist, hist)
# 返回特征向量
return hist.ravel()
# 定义一个函数,用于比较两张图像的特征
def compare_images(img1, img2):
# 计算两张图像的纹理特征
texture_features1 = compute_texture_features(img1)
texture_features2 = compute_texture_features(img2)
# 计算两张图像的形态学特征
morphological_features1 = compute_morphological_features(img1)
morphological_features2 = compute_morphological_features(img2)
# 计算两张图像的颜色特征
color_features1 = compute_color_features(img1)
color_features2 = compute_color_features(img2)
# 将所有特征组合成一个向量
features1 = np.hstack([texture_features1, morphological_features1, color_features1])
features2 = np.hstack([texture_features2, morphological_features2, color_features2])
# 计算两张图像的特征向量之间的欧几里得距离
distance = np.linalg.norm(features1 - features2)
return distance
# 加载所有图像
us_images = []
na_images = []
for i in range(1, 85):
us_images.append(cv2.imread(us_path + str(i) + ".jpg"))
na_images.append(cv2.imread(na_path + str(i) + ".jpg"))
# 比较第一张自然图像和第一张超声图像的特征
distance = compare_images(na_images[0], us_images[0])
print("Distance between the first natural image and the first ultrasound image:", distance)
# 显示第一张自然图像和第一张超声图像
fig, ax = plt.subplots(1, 2)
ax[0].imshow(cv2.cvtColor(na_images[0], cv2.COLOR_BGR2RGB))
ax[0].set_title("Natural Image")
ax[1].imshow(cv2.cvtColor(us_images[0], cv2.COLOR_BGR2RGB))
ax[1].set_title("Ultrasound Image")
plt.show()
```
代码的注释中已经解释了每个函数的作用。我们首先定义了两种图像的文件路径,然后定义了用于计算纹理特征的参数。接下来,我们定义了三个函数,分别用于计算图像的纹理、形态学和颜色特征。最后,我们定义了一个比较函数,用于比较两张图像的特征,并计算它们之间的欧几里得距离。
在主程序中,我们加载所有图像,并比较第一张自然图像和第一张超声图像的特征。我们还显示了这两张图像,以便我们可以比较它们。
注意,在计算纹理特征时,我们使用了Scikit-image库中的greycomatrix和greycoprops函数。这些函数计算灰度共生矩阵和一些常用的纹理特征。在计算颜色特征时,我们将图像转换为HSV颜色空间,并计算颜色直方图。
我们可以运行这个程序,并看到它输出了第一张自然图像和第一张超声图像之间的距离。我们还可以看到这两张图像的显示。我们可以使用相同的方法比较所有图像,并查看它们之间的差异。
阅读全文