用python实现基于概率分布的超声图像与自然图像性质差异分析这一课题,使用opencv,两种图像的文件类型都是jpg,超声图像的文件路径是‘D:/zzz/us2’,自然图像的文件路径是‘D:/zzz/na2’,两种图像都有84张,图像名称是随机的,需要对比两种图像的特征必须有颜色,纹理,形状,差异性分析方法也需要多种,包括完整详细代码
时间: 2023-09-18 10:10:16 浏览: 105
为了实现基于概率分布的超声图像与自然图像性质差异分析,我们需要使用一些Python库和工具:
- OpenCV:用于图像处理和分析。
- NumPy:用于数学计算和数组操作。
- Matplotlib:用于可视化分析结果。
以下是实现代码:
``` python
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 设置超声图像和自然图像路径
us_path = 'D:/zzz/us2'
na_path = 'D:/zzz/na2'
# 定义函数用于获取图像的颜色直方图
def get_color_histogram(image):
# 将图像转换为HSV色彩空间
hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
# 定义颜色范围
color_range = [
([0, 10, 60], [20, 150, 255]), # 红色
([25, 50, 50], [65, 255, 255]), # 黄色
([110, 50, 50], [130, 255, 255]) # 蓝色
]
# 计算每个颜色范围内的像素数量
color_pixels = []
for (lower, upper) in color_range:
mask = cv2.inRange(hsv_image, np.array(lower), np.array(upper))
color_pixels.append(cv2.countNonZero(mask))
# 返回颜色直方图
return np.array(color_pixels) / np.sum(color_pixels)
# 定义函数用于获取图像的纹理特征
def get_texture_features(image):
# 将图像转换为灰度图像
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 计算图像的LBP特征
lbp_image = np.zeros_like(gray_image)
for i in range(3):
for j in range(3):
if i == 1 and j == 1:
continue
shifted_image = cv2.pyrMeanShiftFiltering(gray_image, 2, 5)
shifted_image = cv2.resize(shifted_image, (gray_image.shape[1], gray_image.shape[0]))
mask = (shifted_image > gray_image).astype(np.uint8)
lbp_image += mask * (2 ** (i * 3 + j))
# 计算图像的LBP直方图
lbp_hist = cv2.calcHist([lbp_image], [0], None, [256], [0, 256])
lbp_hist = cv2.normalize(lbp_hist, lbp_hist).flatten()
# 返回LBP直方图
return lbp_hist
# 定义函数用于获取图像的形状特征
def get_shape_features(image):
# 将图像转换为灰度图像
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 进行二值化处理
_, binary_image = cv2.threshold(gray_image, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
# 计算图像的轮廓
_, contours, _ = cv2.findContours(binary_image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 计算图像的面积和周长
area = cv2.contourArea(contours[0])
perimeter = cv2.arcLength(contours[0], True)
# 返回形状特征
return np.array([area, perimeter])
# 定义函数用于计算两个概率分布之间的KL散度
def kl_divergence(p, q):
return np.sum(np.where(p != 0, p * np.log(p / q), 0))
# 初始化结果列表
color_histograms = []
texture_features = []
shape_features = []
# 分别处理超声图像和自然图像
for image_path in [us_path, na_path]:
for i in range(84):
# 读取图像
image = cv2.imread(f'{image_path}/img_{i}.jpg')
# 计算颜色直方图
color_histogram = get_color_histogram(image)
# 计算纹理特征
texture_feature = get_texture_features(image)
# 计算形状特征
shape_feature = get_shape_features(image)
# 将结果添加到列表中
color_histograms.append(color_histogram)
texture_features.append(texture_feature)
shape_features.append(shape_feature)
# 将结果转换为NumPy数组
color_histograms = np.array(color_histograms)
texture_features = np.array(texture_features)
shape_features = np.array(shape_features)
# 计算颜色直方图的KL散度
us_color_histogram = color_histograms[:84]
na_color_histogram = color_histograms[84:]
us_na_color_kl_divergence = kl_divergence(us_color_histogram.mean(axis=0), na_color_histogram.mean(axis=0))
# 计算纹理特征的KL散度
us_texture_features = texture_features[:84]
na_texture_features = texture_features[84:]
us_na_texture_kl_divergence = kl_divergence(us_texture_features.mean(axis=0), na_texture_features.mean(axis=0))
# 计算形状特征的KL散度
us_shape_features = shape_features[:84]
na_shape_features = shape_features[84:]
us_na_shape_kl_divergence = kl_divergence(us_shape_features.mean(axis=0), na_shape_features.mean(axis=0))
# 可视化结果
plt.bar(['Color', 'Texture', 'Shape'], [us_na_color_kl_divergence, us_na_texture_kl_divergence, us_na_shape_kl_divergence])
plt.xlabel('Feature')
plt.ylabel('KL Divergence')
plt.show()
```
在这个代码中,我们首先定义了三个函数,用于获取不同特征的值。其中,`get_color_histogram`函数用于获取颜色直方图,`get_texture_features`函数用于获取纹理特征,`get_shape_features`函数用于获取形状特征。
接下来,我们定义了一个`kl_divergence`函数,用于计算两个概率分布之间的KL散度。
然后,我们通过使用`cv2.imread`函数来读取图像,并将图像的颜色直方图、纹理特征和形状特征添加到相应的列表中。
最后,我们计算了超声图像和自然图像之间的颜色直方图、纹理特征和形状特征的KL散度,并将结果可视化为一个条形图。
需要注意的是,这个代码假设了每个文件夹中有84张图像,且图像名称是从0到83的整数。如果实际情况不同,需要根据实际情况进行修改。
阅读全文