用python实现基于概率分布的超声图像与自然图像性质差异分析这一课题,使用opencv, 两种图像的文件类型都是jpg,超声图像的文件路径是‘D:\zzz\us5’,自然图像的文件路径是‘D:\zzz\na4’,两种图像都有84张,图像的名称都是1到84的顺序数,两种图像的形状大小相同,需要对比两种图像的特征必须有颜色,纹理,形态学特征,差异性分析方法也需要多种,包括完整详细代码
时间: 2023-11-16 11:04:45 浏览: 75
利用OpenCV和Python实现查找图片差异
首先,我们需要导入必要的库,包括opencv,numpy和matplotlib。代码如下:
```python
import cv2
import numpy as np
import matplotlib.pyplot as plt
```
接下来,我们可以定义一个函数来计算图像的颜色直方图。代码如下:
```python
def calcHist(img):
hist = cv2.calcHist([img], [0, 1, 2], None, [8, 8, 8], [0, 256, 0, 256, 0, 256])
hist = cv2.normalize(hist, hist).flatten()
return hist
```
这个函数使用OpenCV的calcHist函数来计算图像的颜色直方图。它使用三个通道(BGR)并将值范围分为8x8x8个bin。最后,它规范化直方图并将其展平为一维数组。
接下来,我们可以定义一个函数来计算图像的纹理特征。我们使用灰度共生矩阵(GLCM)来计算纹理特征。代码如下:
```python
def calcTexture(img):
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
glcm = cv2.calcGLCM(gray, [5], 0, 256, symmetric=True)
contrast = cv2.compareHist(glcm[0], glcm[1], cv2.HISTCMP_CONTRAST)
dissimilarity = cv2.compareHist(glcm[0], glcm[1], cv2.HISTCMP_DISPARITY)
homogeneity = cv2.compareHist(glcm[0], glcm[1], cv2.HISTCMP_INTERSECT)
energy = cv2.compareHist(glcm[0], glcm[1], cv2.HISTCMP_ENERGY)
correlation = cv2.compareHist(glcm[0], glcm[1], cv2.HISTCMP_CORREL)
return np.array([contrast, dissimilarity, homogeneity, energy, correlation])
```
这个函数首先将图像转换为灰度图像。然后,它使用calcGLCM函数计算灰度共生矩阵。我们使用对称GLCM并使用5像素距离。接下来,我们使用cv2.compareHist函数计算不同的纹理特征,包括对比度,不相似度,均匀性,能量和相关性。最后,我们将这些特征组成一个数组。
接下来,我们可以定义一个函数来计算图像的形态学特征。我们使用OpenCV的形态学操作来计算这些特征。代码如下:
```python
def calcMorph(img):
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))
opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel)
closing = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)
gradient = cv2.morphologyEx(thresh, cv2.MORPH_GRADIENT, kernel)
tophat = cv2.morphologyEx(thresh, cv2.MORPH_TOPHAT, kernel)
blackhat = cv2.morphologyEx(thresh, cv2.MORPH_BLACKHAT, kernel)
return np.array([np.sum(opening), np.sum(closing), np.sum(gradient), np.sum(tophat), np.sum(blackhat)])
```
这个函数首先将图像转换为灰度图像,并使用OTSU二值化算法将其转换为二值图像。然后,我们使用cv2.getStructuringElement函数创建一个椭圆形结构元素。接下来,我们使用OpenCV的形态学操作计算不同的形态学特征,包括开运算,闭运算,梯度,顶帽和黑帽。最后,我们将这些特征组成一个数组。
现在,我们可以开始加载图像并计算它们的特征。代码如下:
```python
us_dir = 'D:/zzz/us5/'
na_dir = 'D:/zzz/na4/'
us_features = []
na_features = []
for i in range(1, 85):
us_file = us_dir + str(i) + '.jpg'
na_file = na_dir + str(i) + '.jpg'
us_img = cv2.imread(us_file)
na_img = cv2.imread(na_file)
us_hist = calcHist(us_img)
na_hist = calcHist(na_img)
us_texture = calcTexture(us_img)
na_texture = calcTexture(na_img)
us_morph = calcMorph(us_img)
na_morph = calcMorph(na_img)
us_feature = np.concatenate((us_hist, us_texture, us_morph))
na_feature = np.concatenate((na_hist, na_texture, na_morph))
us_features.append(us_feature)
na_features.append(na_feature)
```
这个代码块使用一个for循环来加载图像并计算它们的特征。对于每个图像,我们首先使用cv2.imread函数加载图像。然后,我们使用之前定义的函数来计算图像的颜色,纹理和形态学特征,并将它们组合成一个特征向量。最后,我们将这些特征向量添加到一个列表中。
现在,我们可以使用这些特征向量来比较两种图像的特征。我们将使用t-SNE算法来降维特征空间,并使用matplotlib来绘制结果。代码如下:
```python
from sklearn.manifold import TSNE
X = np.concatenate((us_features, na_features))
y = np.concatenate((np.zeros(84), np.ones(84)))
tsne = TSNE(n_components=2, random_state=0)
X_tsne = tsne.fit_transform(X)
plt.scatter(X_tsne[y==0, 0], X_tsne[y==0, 1], c='r', label='Ultrasound')
plt.scatter(X_tsne[y==1, 0], X_tsne[y==1, 1], c='b', label='Natural')
plt.legend()
plt.show()
```
这个代码块使用numpy的concatenate函数将两个特征列表合并为一个特征矩阵,并使用numpy的concatenate函数将两个标签列表合并为一个标签向量。然后,我们使用scikit-learn的t-SNE算法将特征向量降为二维,并使用matplotlib的scatter函数将结果可视化。在这个例子中,我们使用红色表示超声图像,蓝色表示自然图像。
完整代码如下:
```python
import cv2
import numpy as np
import matplotlib.pyplot as plt
from sklearn.manifold import TSNE
def calcHist(img):
hist = cv2.calcHist([img], [0, 1, 2], None, [8, 8, 8], [0, 256, 0, 256, 0, 256])
hist = cv2.normalize(hist, hist).flatten()
return hist
def calcTexture(img):
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
glcm = cv2.calcGLCM(gray, [5], 0, 256, symmetric=True)
contrast = cv2.compareHist(glcm[0], glcm[1], cv2.HISTCMP_CONTRAST)
dissimilarity = cv2.compareHist(glcm[0], glcm[1], cv2.HISTCMP_DISPARITY)
homogeneity = cv2.compareHist(glcm[0], glcm[1], cv2.HISTCMP_INTERSECT)
energy = cv2.compareHist(glcm[0], glcm[1], cv2.HISTCMP_ENERGY)
correlation = cv2.compareHist(glcm[0], glcm[1], cv2.HISTCMP_CORREL)
return np.array([contrast, dissimilarity, homogeneity, energy, correlation])
def calcMorph(img):
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))
opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel)
closing = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)
gradient = cv2.morphologyEx(thresh, cv2.MORPH_GRADIENT, kernel)
tophat = cv2.morphologyEx(thresh, cv2.MORPH_TOPHAT, kernel)
blackhat = cv2.morphologyEx(thresh, cv2.MORPH_BLACKHAT, kernel)
return np.array([np.sum(opening), np.sum(closing), np.sum(gradient), np.sum(tophat), np.sum(blackhat)])
us_dir = 'D:/zzz/us5/'
na_dir = 'D:/zzz/na4/'
us_features = []
na_features = []
for i in range(1, 85):
us_file = us_dir + str(i) + '.jpg'
na_file = na_dir + str(i) + '.jpg'
us_img = cv2.imread(us_file)
na_img = cv2.imread(na_file)
us_hist = calcHist(us_img)
na_hist = calcHist(na_img)
us_texture = calcTexture(us_img)
na_texture = calcTexture(na_img)
us_morph = calcMorph(us_img)
na_morph = calcMorph(na_img)
us_feature = np.concatenate((us_hist, us_texture, us_morph))
na_feature = np.concatenate((na_hist, na_texture, na_morph))
us_features.append(us_feature)
na_features.append(na_feature)
X = np.concatenate((us_features, na_features))
y = np.concatenate((np.zeros(84), np.ones(84)))
tsne = TSNE(n_components=2, random_state=0)
X_tsne = tsne.fit_transform(X)
plt.scatter(X_tsne[y==0, 0], X_tsne[y==0, 1], c='r', label='Ultrasound')
plt.scatter(X_tsne[y==1, 0], X_tsne[y==1, 1], c='b', label='Natural')
plt.legend()
plt.show()
```
这个代码块将超声图像和自然图像的特征可视化为二维散点图。我们可以看到,二者在特征空间中有一些重叠,但它们仍然是分开的。这表明,在颜色,纹理和形态学特征方面,超声图像和自然图像之间存在一些显著的差异。
阅读全文