# 使用Numpy和Opencv完成图像的基本数据分析（Part IV）

## 阈值

### 算法

• 计算每个强度等级的直方图和概率。
• 设置初始μi。
• 从阈值 t=0逐步到t=L-1：
• 更新：wi和μi
• 计算：σ2b(t)
• 期望阈值对应于σ2b(t)的最大值。
```import numpy as npimport imageioimport matplotlib.pyplot as pltpic = imageio.imread('img/potato.jpeg')
plt.figure(figsize=(7,7))
plt.axis('off')
plt.imshow(pic);```
```def otsu_threshold(im):   # Compute histogram and probabilities of each intensity level
pixel_counts = [np.sum(im == i) for i in range(256)]    # Initialization
s_max = (0,0)
for threshold in range(256):        # update
w_0 = sum(pixel_counts[:threshold])
w_1 = sum(pixel_counts[threshold:])       mu_0 = sum([i * pixel_counts[i] for i in range(0,threshold)]) / w_0 if w_0 > 0 else 0
mu_1 = sum([i * pixel_counts[i] for i in range(threshold, 256)]) / w_1 if w_1 > 0 else 0       # calculate - inter class variance
s = w_0 * w_1 * (mu_0 - mu_1) ** 2       if s > s_max[1]:
s_max = (threshold, s)

return s_max[0]def threshold(pic, threshold):
return ((pic > threshold) * 255).astype('uint8')gray = lambda rgb : np.dot(rgb[... , :3] , [0.21 , 0.72, 0.07])plt.figure(figsize=(7,7))
plt.imshow(threshold(gray(pic), otsu_threshold(pic)), cmap='Greys')
plt.axis('off');```

## K均值聚类|KMeans Clustering

k-均值聚类是矢量量化的一种方法，最初是应用于信号处理中，目前常用于数据挖掘中的聚类分析。在OTSU阈值法中，我们找到了最小化内插像素方差的阈值。因此，我们可以不从灰度图像中寻找合适的阈值，而可以在彩色空间中去寻找聚类，通过这样的处理，最终演变为 K-均值聚类技术。

```from sklearn import clusterimport matplotlib.pyplot as plt# load imagepic = imageio.imread('img/purple.jpg')plt.figure(figsize=(7,7))
plt.imshow(pic)
plt.axis('off');```

```x, y, z = pic.shape
pic_2d = pic.reshape(x*y, z)```

```%%time# fit on the image with cluster fivekmeans_cluster = cluster.KMeans(n_clusters=5)
kmeans_cluster.fit(pic_2d)cluster_centers = kmeans_cluster.cluster_centers_
cluster_labels = kmeans_cluster.labels_
Wall time: 16.2 s```

```plt.figure(figsize=(7,7))
plt.imshow(cluster_centers[cluster_labels].reshape(x, y, z))
plt.axis('off');```

## 线型检测

### 霍夫变换|Hough Transform

```whereρ = distance from origin to the line. [-Dmax, Dmax]
Dmax is the diagonal length of the image.θ = angle from origin to the line. [-90° to 90°]```

### 算法

• 拐角或边缘检测
• ρ范围和θ范围创建
• ρ：-Dmax ~Dmax；
• θ：-90~90；
• 霍夫累加器： 二维数组的行数等于ρvalues的数量，列数等于θ的数量；
• 在累加器中投票

• 峰值检测

```def hough_line(img):
# Rho and Theta ranges
width, height = img.shape
diag_len = int(np.ceil(np.sqrt(width * width + height * height)))   # Dmax
rhos = np.linspace(-diag_len, diag_len, diag_len * 2.0)    # Cache some resuable values
cos_t = np.cos(thetas)
sin_t = np.sin(thetas)
num_thetas = len(thetas)    # Hough accumulator array of theta vs rho
accumulator = np.zeros((2 * diag_len, num_thetas), dtype=np.uint64)
y_idxs, x_idxs = np.nonzero(img)  # (row, col) indexes to edges   # Vote in the hough accumulator
for i in range(len(x_idxs)):
x = x_idxs[i]
y = y_idxs[i]
for t_idx in range(num_thetas):            # Calculate rho. diag_len is added for a positive index
rho = round(x * cos_t[t_idx] + y * sin_t[t_idx]) + diag_len
accumulator[rho, t_idx] += 1
return accumulator, thetas, rhos```

## 边缘检测

• 索贝尔算子（Sobel）
• 卡尼算子（Canny）
• 普鲁伊特算子（Prewitt）
• 罗伯茨算子（Roberts）
• 模糊逻辑方法（fuzzy logic）

• 1.应用高斯滤波器；
• 2.找到强度梯度；
• 3.应用非最大抑制；
• 4.应用双重阈值；
• 5.通过滞后跟踪边缘；

## 相关

• 使用Numpy和Opencv完成图像的基本数据分析（Part I）；
• 使用Numpy和Opencv完成图像的基本数据分析（Part II）；
• 使用Numpy和Opencv完成图像的基本数据分析（Part III）；

86 篇文章9 人订阅

0 条评论