用python实现基于概率分布的超声图像与自然图像性质差异分析这一课题,使用opencv, 两种图像的文件类型都是jpg,超声图像的文件路径是‘D:\zzz\us5’,自然图像的文件路径是‘D:\zzz\na4’,两种图像都有84张,图像的名称都是1到84的顺序数,两种图像的形状大小相同,需要对比两种图像的特征必须有颜色,纹理,形态学特征,差异性分析方法也需要多种,包括完整详细代码
时间: 2023-11-16 22:04:45 浏览: 136
基于Python+OpenCV实现双目立体视觉的图像匹配与测距代码+文档说明(大作业)
首先,我们需要安装一些必要的库,包括opencv、numpy、matplotlib等。可以使用以下命令进行安装:
```
pip install opencv-python numpy matplotlib
```
接下来,我们可以按照以下步骤进行超声图像与自然图像性质差异分析。
1. 加载图像
我们可以使用opencv库中的`cv2.imread()`函数来加载图像。由于两种图像的文件名都是按顺序排列的,因此我们可以使用一个循环来加载所有图像。
```python
import cv2
import numpy as np
import matplotlib.pyplot as plt
us_path = 'D:/zzz/us5/'
na_path = 'D:/zzz/na4/'
us_images = []
na_images = []
for i in range(1, 85):
us_image = cv2.imread(us_path + str(i) + '.jpg')
na_image = cv2.imread(na_path + str(i) + '.jpg')
us_images.append(us_image)
na_images.append(na_image)
```
2. 提取颜色特征
我们可以使用opencv库中的`cv2.calcHist()`函数来提取图像的颜色特征。该函数可以计算图像的直方图,我们可以通过调整参数来控制直方图的维度、范围等。在本例中,我们将提取三个通道的颜色特征,并将每个通道的直方图维度设置为16,范围设置为0到255。
```python
bins = 16
hist_size = [bins, bins, bins]
ranges = [0, 256, 0, 256, 0, 256]
us_hist = []
na_hist = []
for i in range(84):
us_hist.append(cv2.calcHist([us_images[i]], [0, 1, 2], None, hist_size, ranges))
na_hist.append(cv2.calcHist([na_images[i]], [0, 1, 2], None, hist_size, ranges))
```
3. 提取纹理特征
我们可以使用opencv库中的`cv2.cvtColor()`函数和`cv2.Laplacian()`函数来提取图像的纹理特征。该函数可以计算图像的拉普拉斯算子,用于检测图像中的边缘和纹理。在本例中,我们将使用灰度图像,并将拉普拉斯算子的卷积核大小设置为3。
```python
gray_us_images = []
gray_na_images = []
us_texture = []
na_texture = []
for i in range(84):
gray_us_image = cv2.cvtColor(us_images[i], cv2.COLOR_BGR2GRAY)
gray_na_image = cv2.cvtColor(na_images[i], cv2.COLOR_BGR2GRAY)
gray_us_images.append(gray_us_image)
gray_na_images.append(gray_na_image)
us_texture.append(cv2.Laplacian(gray_us_image, cv2.CV_64F, ksize=3).var())
na_texture.append(cv2.Laplacian(gray_na_image, cv2.CV_64F, ksize=3).var())
```
4. 提取形态学特征
我们可以使用opencv库中的`cv2.erode()`函数和`cv2.dilate()`函数来提取图像的形态学特征。这些函数可以对图像进行腐蚀和膨胀操作,用于检测图像中的边缘和形态学特征。在本例中,我们将使用一个3x3的卷积核。
```python
kernel = np.ones((3, 3), np.uint8)
us_morphology = []
na_morphology = []
for i in range(84):
us_gray_image = cv2.cvtColor(us_images[i], cv2.COLOR_BGR2GRAY)
na_gray_image = cv2.cvtColor(na_images[i], cv2.COLOR_BGR2GRAY)
us_erode = cv2.erode(us_gray_image, kernel, iterations=1)
us_dilate = cv2.dilate(us_gray_image, kernel, iterations=1)
us_morphology.append(np.sum(np.abs(us_erode - us_dilate)))
na_erode = cv2.erode(na_gray_image, kernel, iterations=1)
na_dilate = cv2.dilate(na_gray_image, kernel, iterations=1)
na_morphology.append(np.sum(np.abs(na_erode - na_dilate)))
```
5. 分析差异性
我们可以使用numpy库中的`numpy.mean()`函数和`numpy.std()`函数来计算每种特征的平均值和标准差,并使用matplotlib库中的`plt.bar()`函数将结果可视化。在本例中,我们将绘制两种图像的颜色、纹理、形态学特征的平均值和标准差。
```python
us_color_mean = np.mean(us_hist, axis=0)
na_color_mean = np.mean(na_hist, axis=0)
us_color_std = np.std(us_hist, axis=0)
na_color_std = np.std(na_hist, axis=0)
us_texture_mean = np.mean(us_texture)
na_texture_mean = np.mean(na_texture)
us_texture_std = np.std(us_texture)
na_texture_std = np.std(na_texture)
us_morphology_mean = np.mean(us_morphology)
na_morphology_mean = np.mean(na_morphology)
us_morphology_std = np.std(us_morphology)
na_morphology_std = np.std(na_morphology)
labels = ['Color', 'Texture', 'Morphology']
us_means = [np.mean(us_color_mean), us_texture_mean, us_morphology_mean]
us_stds = [np.mean(us_color_std), us_texture_std, us_morphology_std]
na_means = [np.mean(na_color_mean), na_texture_mean, na_morphology_mean]
na_stds = [np.mean(na_color_std), na_texture_std, na_morphology_std]
x = np.arange(len(labels))
width = 0.35
fig, ax = plt.subplots()
rects1 = ax.bar(x - width/2, us_means, width, yerr=us_stds, label='Ultrasound')
rects2 = ax.bar(x + width/2, na_means, width, yerr=na_stds, label='Nature')
ax.set_ylabel('Value')
ax.set_title('Comparison of Features')
ax.set_xticks(x)
ax.set_xticklabels(labels)
ax.legend()
plt.show()
```
完整代码如下:
阅读全文