链码的起点归一化、循环归一化优缺点
时间: 2023-10-28 19:05:12 浏览: 199
链码的起点归一化和循环归一化是两种常用的链码归一化方法,它们各有优缺点。
起点归一化是将链码的起点固定在一个特定的位置上,然后将整个链码旋转至这个位置。这种方法的优点是简单易懂,计算量小,适用于直线或者几何形状规则的对象。但这种方法的缺点也很明显,因为链码的起点被固定了,所以对于非规则对象和弯曲的线条,它的效果不佳。
循环归一化是将链码的起点旋转至链码中最小的值处,然后按照链码的顺序依次进行旋转。这种方法的优点是适用范围广,对于任何形状的对象都可以进行归一化处理。但这种方法的缺点也是明显的,计算量大,需要遍历整个链码,因此处理时间较长。
综上所述,起点归一化和循环归一化各有优点和缺点,具体的应用场景需要根据实际情况进行选择。如果对象比较规则,且需要快速处理,可以选择起点归一化;如果对象比较复杂,需要精确的归一化处理,可以选择循环归一化。
相关问题
链码的循环归一化python3代码
链码的循环归一化(Loop Normalization of Chain Codes)是一种图像处理技术,通常用于曲线的特征提取和比较。以下是一个简单的 Python 3 实现:
```python
import numpy as np
def chain_code_normalization(chain_code):
"""
对链码进行循环归一化
:param chain_code: 输入的链码
:return: 归一化后的链码
"""
# 计算链码的方向角度
angles = np.array([np.arctan2(chain_code[i+1][1]-chain_code[i][1], chain_code[i+1][0]-chain_code[i][0]) for i in range(len(chain_code)-1)])
# 计算平均角度
mean_angle = np.mean(angles)
# 计算旋转角度
rotation_angle = -(mean_angle + np.pi/2)
# 构造旋转矩阵
c, s = np.cos(rotation_angle), np.sin(rotation_angle)
rotation_matrix = np.array([[c, -s], [s, c]])
# 对链码进行旋转和平移
chain_code_norm = np.dot(rotation_matrix, (chain_code.T - np.mean(chain_code, axis=0)).T).T
# 将链码归一化到 [-1, 1]
chain_code_norm /= np.max(np.abs(chain_code_norm))
return chain_code_norm
```
代码中,我们首先计算链码的方向角度,然后计算平均角度并根据其计算旋转角度。接着,我们构造旋转矩阵,对链码进行旋转和平移,并将链码归一化到 [-1, 1] 的范围内。最终返回归一化后的链码。
链码的起点归一化、循环归一化、边界的长度、直径、形状数代码实现
链码的起点归一化:
```python
def normalize_start_point(chain_code):
# 计算链码所在位置
min_x = min_y = sys.maxsize
for code in chain_code:
x, y = code_to_coordinate(code)
if x < min_x:
min_x = x
if y < min_y:
min_y = y
# 将链码起点平移到(0,0)位置
normalized_code = []
for code in chain_code:
x, y = code_to_coordinate(code)
normalized_code.append(coordinate_to_code(x - min_x, y - min_y))
return normalized_code
```
循环归一化:
```python
def normalize_loop(chain_code):
# 首先进行起点归一化
normalized_code = normalize_start_point(chain_code)
# 找到最小的循环表示法
min_code = normalized_code[:]
for i in range(len(normalized_code)):
code = normalized_code[i:] + normalized_code[:i]
if code < min_code:
min_code = code
return min_code
```
边界的长度:
```python
def boundary_length(chain_code):
length = 0
for code in chain_code:
if code % 2 == 0:
length += 1
elif code % 4 == 1:
length += math.sqrt(2)
else:
length += 1 + math.sqrt(2)
return length
```
直径:
```python
def diameter(chain_code):
max_distance = 0
for i in range(len(chain_code)):
for j in range(i+1, len(chain_code)):
distance = code_distance(chain_code[i], chain_code[j])
if distance > max_distance:
max_distance = distance
return max_distance
```
形状数:
```python
def shape_number(chain_code):
# 首先进行起点归一化
normalized_code = normalize_start_point(chain_code)
# 计算转角数
corner_count = 0
for i in range(1, len(normalized_code)):
if abs(normalized_code[i] - normalized_code[i-1]) > 1:
corner_count += 1
# 计算形状数
shape_count = (corner_count - 4) / 4
return shape_count
```
阅读全文