用python实现基于概率分布的超声图像与自然图像性质差异分析这一课题,使用opencv, 不能用greycomatrix, greycoprops,两种图像的文件类型都是jpg,超声图像的文件路径是‘D:\zzz\us5’,自然图像的文件路径是‘D:\zzz\na4’,两种图像都有84张,图像的名称都是1到84的顺序数,两种图像的形状大小相同,需要对比两种图像的特征必须有颜色,纹理,形态学特征,差异性分析方法也需要多种,包括完整详细代码
时间: 2023-11-16 22:07:52 浏览: 27
首先,我们需要安装必要的库和模块:
```python
import cv2
import numpy as np
import os
from matplotlib import pyplot as plt
```
接下来,我们可以定义一个函数来计算图像的颜色特征。我们将使用彩色直方图来表示颜色分布。我们可以使用OpenCV的calcHist函数来计算直方图。
```python
def get_color_feature(image):
# 将图像转换为HSV格式
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
# 定义HSV的范围
lower_blue = np.array([110, 50, 50])
upper_blue = np.array([130, 255, 255])
lower_green = np.array([50, 50, 50])
upper_green = np.array([70, 255, 255])
lower_red = np.array([0, 50, 50])
upper_red = np.array([10, 255, 255])
# 创建掩码
mask_blue = cv2.inRange(hsv, lower_blue, upper_blue)
mask_green = cv2.inRange(hsv, lower_green, upper_green)
mask_red = cv2.inRange(hsv, lower_red, upper_red)
# 计算直方图
hist_blue = cv2.calcHist([image], [0], mask_blue, [256], [0, 256])
hist_green = cv2.calcHist([image], [0], mask_green, [256], [0, 256])
hist_red = cv2.calcHist([image], [0], mask_red, [256], [0, 256])
# 归一化直方图
cv2.normalize(hist_blue, hist_blue, alpha=0, beta=1, norm_type=cv2.NORM_MINMAX)
cv2.normalize(hist_green, hist_green, alpha=0, beta=1, norm_type=cv2.NORM_MINMAX)
cv2.normalize(hist_red, hist_red, alpha=0, beta=1, norm_type=cv2.NORM_MINMAX)
# 将三个直方图拼接在一起
color_feature = np.concatenate([hist_blue, hist_green, hist_red], axis=0)
return color_feature
```
接下来,我们可以定义一个函数来计算图像的纹理特征。我们将使用灰度共生矩阵(GLCM)来表示图像的纹理。
```python
def get_texture_feature(image):
# 将图像转换为灰度图像
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 计算灰度共生矩阵
glcm = cv2.calcGLCM(gray, [5], 0, 256, symmetric=True)
# 计算统计特征
contrast = cv2.compareHist(cv2.normalize(glcm[:, :, 0, 0], None, alpha=0, beta=1, norm_type=cv2.NORM_MINMAX), np.zeros((256, 256)), cv2.HISTCMP_BHATTACHARYYA)
dissimilarity = cv2.compareHist(cv2.normalize(glcm[:, :, 0, 1], None, alpha=0, beta=1, norm_type=cv2.NORM_MINMAX), np.zeros((256, 256)), cv2.HISTCMP_BHATTACHARYYA)
homogeneity = cv2.compareHist(cv2.normalize(glcm[:, :, 0, 2], None, alpha=0, beta=1, norm_type=cv2.NORM_MINMAX), np.zeros((256, 256)), cv2.HISTCMP_BHATTACHARYYA)
energy = cv2.compareHist(cv2.normalize(glcm[:, :, 0, 3], None, alpha=0, beta=1, norm_type=cv2.NORM_MINMAX), np.zeros((256, 256)), cv2.HISTCMP_BHATTACHARYYA)
correlation = cv2.compareHist(cv2.normalize(glcm[:, :, 0, 4], None, alpha=0, beta=1, norm_type=cv2.NORM_MINMAX), np.zeros((256, 256)), cv2.HISTCMP_BHATTACHARYYA)
# 将统计特征拼接在一起
texture_feature = np.array([contrast, dissimilarity, homogeneity, energy, correlation])
return texture_feature
```
最后,我们可以定义一个函数来计算形态学特征。我们将使用边缘检测来提取图像的轮廓,并计算轮廓的面积和周长。
```python
def get_morphology_feature(image):
# 将图像转换为灰度图像
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 边缘检测
edges = cv2.Canny(gray, 100, 200)
# 寻找轮廓
contours, hierarchy = cv2.findContours(edges, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# 计算面积和周长
area = cv2.contourArea(contours[0])
perimeter = cv2.arcLength(contours[0], True)
# 将面积和周长拼接在一起
morphology_feature = np.array([area, perimeter])
return morphology_feature
```
接下来,我们可以定义一个函数来获取图像的特征向量。
```python
def get_feature_vector(image):
# 计算颜色特征
color_feature = get_color_feature(image)
# 计算纹理特征
texture_feature = get_texture_feature(image)
# 计算形态学特征
morphology_feature = get_morphology_feature(image)
# 将三种特征拼接在一起
feature_vector = np.concatenate([color_feature, texture_feature, morphology_feature], axis=0)
return feature_vector
```
现在,我们可以使用上述函数来计算超声图像和自然图像的特征向量,并使用多种方法来比较它们的差异。
首先,我们可以使用欧几里得距离来比较两个图像的特征向量。
```python
# 加载超声图像和自然图像
us_path = 'D:/zzz/us5'
na_path = 'D:/zzz/na4'
us_images = [cv2.imread(os.path.join(us_path, f'{i}.jpg')) for i in range(1, 85)]
na_images = [cv2.imread(os.path.join(na_path, f'{i}.jpg')) for i in range(1, 85)]
# 计算超声图像和自然图像的特征向量
us_feature_vectors = [get_feature_vector(image) for image in us_images]
na_feature_vectors = [get_feature_vector(image) for image in na_images]
# 使用欧几里得距离比较两个图像的特征向量
euclidean_distances = []
for i in range(84):
for j in range(i+1, 84):
euclidean_distance = np.linalg.norm(us_feature_vectors[i] - na_feature_vectors[j])
euclidean_distances.append(euclidean_distance)
# 绘制直方图
plt.hist(euclidean_distances, bins=50)
plt.title('Euclidean Distance')
plt.xlabel('Distance')
plt.ylabel('Count')
plt.show()
```
我们还可以使用余弦相似度来比较两个图像的特征向量。
```python
# 使用余弦相似度比较两个图像的特征向量
cosine_similarities = []
for i in range(84):
for j in range(i+1, 84):
cosine_similarity = np.dot(us_feature_vectors[i], na_feature_vectors[j]) / (np.linalg.norm(us_feature_vectors[i]) * np.linalg.norm(na_feature_vectors[j]))
cosine_similarities.append(cosine_similarity)
# 绘制直方图
plt.hist(cosine_similarities, bins=50)
plt.title('Cosine Similarity')
plt.xlabel('Similarity')
plt.ylabel('Count')
plt.show()
```
我们还可以使用SVM来训练一个分类器,将超声图像和自然图像分开。
```python
# 创建训练集和测试集
X_train = np.concatenate([us_feature_vectors[:50], na_feature_vectors[:50]], axis=0)
X_test = np.concatenate([us_feature_vectors[50:], na_feature_vectors[50:]], axis=0)
y_train = np.array([0]*50 + [1]*50)
y_test = np.array([0]*34 + [1]*34)
# 训练SVM模型
from sklearn import svm
clf = svm.SVC(kernel='linear')
clf.fit(X_train, y_train)
# 测试SVM模型
y_pred = clf.predict(X_test)
# 计算精度和召回率
from sklearn.metrics import accuracy_score, recall_score
accuracy = accuracy_score(y_test, y_pred)
recall = recall_score(y_test, y_pred)
print('Accuracy:', accuracy)
print('Recall:', recall)
```
完整代码如下: