从Freeman链代码生成图像矩阵

时间:2018-12-17 16:08:07

标签: python python-3.x data-mining pattern-mining

假设我在python列表中有一个8向自由人链代码,如下所示:

freeman_code = [3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 5]

其中的方向将定义如下:

Freeman code directions

我需要将其转换为大小为1s和0s的可变尺寸图像矩阵,其中1s表示形状,例如:

image_matrix = [
[0, 0, 1, 0, 0, 1],
[0, 0, 0, 1, 0, 1],
[0, 0, 0, 0, 1, 1]
]

当然,以上并不是上述Freeman代码的确切实现。有没有使用python或任何语言实现的实现? 我的想法(在python中): 使用defaultdicts的defaultdict,默认值为0:

ImgMatrixDict = defaultdict(lambda: defaultdict(lambda:0))

,然后从中点开始,例如ImgMatrixDict[25][25],然后在遍历时根据Freeman代码值将值更改为1。之后,我将ImgMatrixDict转换为列表列表。

这是一个可行的主意吗?是否存在任何实现此目的的库或建议?任何想法/伪代码将不胜感激。

PS:在性能上,是的,这并不重要,因为我不会实时进行此操作,但是通常代码长度约为15-20个字符。我认为按此矩阵乘以50 * 50就足够了。

2 个答案:

答案 0 :(得分:1)

如果我正确理解了您的问题:

import numpy as np 
import matplotlib.pyplot as plt

freeman_code = [3, 3, 3, 6, 6, 4, 6, 7, 7, 0, 0, 6]
img = np.zeros((10,10))

x, y = 4, 4 
img[y][x] = 1
for direction in freeman_code:
    if direction in [1,2,3]:
        y -= 1
    if direction in [5,6,7]:
        y += 1
    if direction in  [3,4,5]:
        x -= 1
    if direction in [0,1,7]:
        x += 1

    img[y][x] = 1

plt.imshow(img, cmap='binary', vmin=0, vmax=1)
plt.show()

enter image description here

答案 1 :(得分:1)

这是python中的解决方案。字典不适合这个问题,您最好使用列表列表来模拟表。

D = 10

# DY, DX
FREEMAN = [(0, 1), (-1, 1), (-1, 0), (-1, -1), (0, -1), (1, -1), (1, 0), (1, 1)]

freeman_code = [3, 3, 3, 3, 6, 6, 6, 6, 0, 0, 0, 0]
image = [[0]*D for x in range(D)]


y = D/2
x = D/2
image[y][x] = 1

for i in freeman_code:
    dy, dx = FREEMAN[i]
    y += dy
    x += dx
    image[y][x] = 1

print("freeman_code")
print(freeman_code)
print("image")
for line in image:
    strline = "".join([str(x) for x in line])
    print(strline)


>0000000000
>0100000000
>0110000000
>0101000000
>0100100000
>0111110000
>0000000000
>0000000000
>0000000000
>0000000000

请注意,图像创建是以下内容的压缩表达:

image = []
for y in range(D):
    line = []
    for x in range(D):
        line.append(0)
    image.append(line)

如果有一天,您需要更好的性能来处理更大的图像,则可以使用numpy库解决方案,但需要对python的基本了解。这是一个示例:

import numpy as np

D = 10

# DY, DX
FREEMAN = [(0, 1), (-1, 1), (-1, 0), (-1, -1), (0, -1), (1, -1), (1, 0), (1, 1)]
DX = np.array([1, 1, 0, -1, -1, -1, 0, 1]) 
DY = np.array([0, -1, -1, -1, 0, 1, 1, 1]) 

freeman_code = np.array([3, 3, 3, 3, 6, 6, 6, 6, 0, 0, 0, 0])
image = np.zeros((D, D), int)

y0 = D/2
x0 = D/2
image[y0, x0] = 1

dx = DX[freeman_code]
dy = DY[freeman_code]

xs = np.cumsum(dx)+x0
ys = np.cumsum(dy)+y0

print(xs)
print(ys)

image[ys, xs] = 1

print("freeman_code")
print(freeman_code)
print("image")
print(image)

在此,先前解决方案中使用“ for”构建的所有循环都在C中快速处理。