用python实现基于概率分布的超声图像与自然图像性质差异分析这一课题,使用opencv, 两种图像的文件类型都是jpg,超声图像的文件路径是‘D:\zzz\us5’,自然图像的文件路径是‘D:\zzz\na4’,两种图像都有84张,图像的名称都是1到84的顺序数,两种图像的形状大小相同,需要对比两种图像的特征必须有颜色,纹理,形状,差异性分析方法也需要多种,包括完整详细代码
时间: 2023-11-16 11:03:48 浏览: 190
以下是基于概率分布的超声图像与自然图像性质差异分析的Python代码,使用OpenCV库实现:
```python
import cv2
import numpy as np
from matplotlib import pyplot as plt
# 定义文件路径
us_file_path = 'D:/zzz/us5/'
na_file_path = 'D:/zzz/na4/'
# 定义特征分析函数
def feature_analysis(image):
# 颜色特征分析
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
hist_h = cv2.calcHist([hsv], [0], None, [180], [0, 180])
hist_s = cv2.calcHist([hsv], [1], None, [256], [0, 256])
hist_v = cv2.calcHist([hsv], [2], None, [256], [0, 256])
# 纹理特征分析
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
gabor_kernels = []
for theta in range(4):
theta = theta / 4. * np.pi
for sigma in (1, 3):
for frequency in (0.05, 0.25):
kernel = cv2.getGaborKernel((5, 5), sigma, theta, frequency, 0.8, 0, ktype=cv2.CV_32F)
kernel /= 1.5 * kernel.sum()
gabor_kernels.append(kernel)
feats = []
for kernel in gabor_kernels:
filtered = cv2.filter2D(gray, cv2.CV_8UC3, kernel)
stats = cv2.calcHist([filtered], [0], None, [256], [0, 256])
feats.extend(stats)
# 形状特征分析
edges = cv2.Canny(gray, 100, 200)
contours, hierarchy = cv2.findContours(edges, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cnt = max(contours, key=cv2.contourArea)
epsilon = 0.01 * cv2.arcLength(cnt, True)
approx = cv2.approxPolyDP(cnt, epsilon, True)
area = cv2.contourArea(cnt)
perimeter = cv2.arcLength(cnt, True)
circularity = 4 * np.pi * area / perimeter ** 2
# 返回特征向量
return np.concatenate([hist_h.ravel(), hist_s.ravel(), hist_v.ravel(), feats, [circularity]])
# 定义差异性分析方法
def difference_analysis(image1, image2):
# 计算两张图像的特征向量
feature_vec1 = feature_analysis(image1)
feature_vec2 = feature_analysis(image2)
# 计算两张图像的概率分布
mean1, std1 = cv2.meanStdDev(image1)
mean2, std2 = cv2.meanStdDev(image2)
p1 = 1 / (2 * np.pi * std1 ** 2) ** 0.5 * np.exp(-0.5 * ((image1 - mean1) / std1) ** 2)
p2 = 1 / (2 * np.pi * std2 ** 2) ** 0.5 * np.exp(-0.5 * ((image2 - mean2) / std2) ** 2)
# 计算KL散度
kl_div1 = np.sum(np.where(p1 != 0, p1 * np.log(p1 / p2), 0))
kl_div2 = np.sum(np.where(p2 != 0, p2 * np.log(p2 / p1), 0))
# 计算欧几里得距离
euclidean_dist = np.linalg.norm(feature_vec1 - feature_vec2)
# 计算相似度
similarity = 1 / (1 + kl_div1 + kl_div2 + euclidean_dist)
return similarity
# 加载图像并进行差异性分析
us_images = []
na_images = []
for i in range(1, 85):
# 加载超声图像
us_image = cv2.imread(us_file_path + str(i) + '.jpg')
us_images.append(us_image)
# 加载自然图像
na_image = cv2.imread(na_file_path + str(i) + '.jpg')
na_images.append(na_image)
# 进行差异性分析
similarity = difference_analysis(us_image, na_image)
print('超声图像与自然图像 %d 的差异性分析结果为:%.4f' % (i, similarity))
```
代码首先定义了文件路径和特征分析函数`feature_analysis()`,该函数分析了输入图像的颜色、纹理和形状特征,并返回特征向量。然后定义了差异性分析方法`difference_analysis()`,该方法计算了两张图像的概率分布、KL散度、欧几里得距离和相似度,并返回相似度。最后,代码加载了所有图像并进行了差异性分析,输出了每张超声图像与自然图像的差异性分析结果。
阅读全文