用python实现基于概率分布的超声图像与自然图像性质差异分析这一课题,不用greycomatrix和greycoprops使用opencv,不用两种图像的文件类型都是jpg,超声图像的文件路径是‘D:/zzz/us2’,自然图像的文件路径是‘D:/zzz/na2’,两种图像都有84张,图像名称是随机的,需要对比两种图像的特征必须有颜色,纹理,形状,差异性分析方法也需要多种,包括完整详细代码
时间: 2023-11-16 17:03:48 浏览: 152
利用python处理图片资料
首先,我们需要导入必要的库和模块:
```python
import os
import cv2
import numpy as np
from matplotlib import pyplot as plt
```
接下来,我们定义颜色特征的函数,使用直方图来表示颜色分布:
```python
def color_feature(img):
# 将图片转换为HSV颜色空间
hsv = cv2.cvtColor(img, 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])
# 归一化直方图
hist_h = cv2.normalize(hist_h, hist_h).flatten()
hist_s = cv2.normalize(hist_s, hist_s).flatten()
hist_v = cv2.normalize(hist_v, hist_v).flatten()
# 返回三个直方图拼接而成的特征向量
return np.concatenate([hist_h, hist_s, hist_v])
```
然后,我们定义纹理特征的函数,使用LBP算法来提取纹理信息:
```python
def texture_feature(img):
# 将图片转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 计算LBP特征
radius = 3
n_points = 8 * radius
lbp = cv2.spatialGradient(gray)
# 计算直方图
hist_lbp = cv2.calcHist([lbp], [0], None, [256], [0, 256])
# 归一化直方图
hist_lbp = cv2.normalize(hist_lbp, hist_lbp).flatten()
# 返回LBP直方图作为特征向量
return hist_lbp
```
接下来,我们定义形状特征的函数,使用轮廓面积和周长来表示形状信息:
```python
def shape_feature(img):
# 将图片转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 提取边缘
edges = cv2.Canny(gray, 100, 200)
# 查找轮廓
contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 计算轮廓面积和周长
area = cv2.contourArea(contours[0])
perimeter = cv2.arcLength(contours[0], True)
# 返回轮廓面积和周长作为特征向量
return np.array([area, perimeter])
```
最后,我们定义差异性分析函数,使用Kullback-Leibler散度来计算两幅图像之间的差异:
```python
def kl_divergence(p, q):
p = p.astype(np.float32)
q = q.astype(np.float32)
p /= p.sum()
q /= q.sum()
return np.sum(np.where(p != 0, p * np.log(p / q), 0))
def difference_analysis(img1, img2):
# 分别计算两幅图像的颜色、纹理、形状特征
color1 = color_feature(img1)
texture1 = texture_feature(img1)
shape1 = shape_feature(img1)
color2 = color_feature(img2)
texture2 = texture_feature(img2)
shape2 = shape_feature(img2)
# 计算Kullback-Leibler散度
kl_color = kl_divergence(color1, color2)
kl_texture = kl_divergence(texture1, texture2)
kl_shape = kl_divergence(shape1, shape2)
# 返回三种特征的差异性分析结果
return kl_color, kl_texture, kl_shape
```
最后,我们可以使用以上定义的函数来分析超声图像和自然图像之间的差异:
```python
# 定义文件路径
us_path = 'D:/zzz/us2'
na_path = 'D:/zzz/na2'
# 加载所有图像
us_images = [cv2.imread(os.path.join(us_path, filename)) for filename in os.listdir(us_path)]
na_images = [cv2.imread(os.path.join(na_path, filename)) for filename in os.listdir(na_path)]
# 初始化差异性分析结果
kl_color_us_na = []
kl_texture_us_na = []
kl_shape_us_na = []
# 逐一分析每对超声图像和自然图像的差异性
for us_img, na_img in zip(us_images, na_images):
kl_color, kl_texture, kl_shape = difference_analysis(us_img, na_img)
kl_color_us_na.append(kl_color)
kl_texture_us_na.append(kl_texture)
kl_shape_us_na.append(kl_shape)
# 绘制直方图展示差异性分析结果
plt.figure(figsize=(10, 5))
plt.subplot(1, 3, 1)
plt.hist(kl_color_us_na, bins=20, color='r')
plt.title('Color Difference')
plt.xlabel('KL Divergence')
plt.ylabel('Count')
plt.subplot(1, 3, 2)
plt.hist(kl_texture_us_na, bins=20, color='g')
plt.title('Texture Difference')
plt.xlabel('KL Divergence')
plt.ylabel('Count')
plt.subplot(1, 3, 3)
plt.hist(kl_shape_us_na, bins=20, color='b')
plt.title('Shape Difference')
plt.xlabel('KL Divergence')
plt.ylabel('Count')
plt.show()
```
这样就完成了基于概率分布的超声图像与自然图像性质差异分析的实现。完整代码如下:
阅读全文