Opencv 4-连接数

请根据4-连接数将renketsu.png上色。

4-连接数可以用于显示附近像素的状态。通常,对于中心像素x_0(x,y)不为零的情况,邻域定义如下:
\begin{matrix}
x_4(x-1,y-1)& x_3(x,y-1)& x_2(x+1,y-1)\\
x_5(x-1,y)& x_0(x,y) &x_1(x+1,y)\\
x_6(x-1,y+1)& x_7(x,y+1)& x_8(x+1,y+1)
\end{matrix}

这里,4-连接数通过以下等式计算:
S = (x_1 – x_1\ x_2\ x_3) + (x_3 – x_3\ x_4\ x_5) + (x_5 – x_5\ x_6\ x_7) + (x_7 – x_7\ x_8\ x_1)
S的取值范围为[0,4]
S = 0: 内部点;
S = 1:端点;
S = 2:连接点;
S = 3:分支点;
S = 4:交叉点。

python实现:

import cv2
import numpy as np
import matplotlib.pyplot as plt

# Connect 4
def connect_4(img):
    # get shape
    H, W, C = img.shape

    # prepare temporary image
    tmp = np.zeros((H, W), dtype=np.int)

    # binarize
    tmp[img[..., 0] > 0] = 1

    # prepare out image
    out = np.zeros((H, W, 3), dtype=np.uint8)

    # each pixel
    for y in range(H):
        for x in range(W):
            if tmp[y, x] < 1:
                continue

            S = 0
            S += (tmp[y,min(x+1,W-1)] - tmp[y,min(x+1,W-1)] * tmp[max(y-1,0),min(x+1,W-1)] * tmp[max(y-1,0),x])
            S += (tmp[max(y-1,0),x] - tmp[max(y-1,0),x] * tmp[max(y-1,0),max(x-1,0)] * tmp[y,max(x-1,0)])
            S += (tmp[y,max(x-1,0)] - tmp[y,max(x-1,0)] * tmp[min(y+1,H-1),max(x-1,0)] * tmp[min(y+1,H-1),x])
            S += (tmp[min(y+1,H-1),x] - tmp[min(y+1,H-1),x] * tmp[min(y+1,H-1),min(x+1,W-1)] * tmp[y,min(x+1,W-1)])

            if S == 0:
                out[y,x] = [0, 0, 255]
            elif S == 1:
                out[y,x] = [0, 255, 0]
            elif S == 2:
                out[y,x] = [255, 0, 0]
            elif S == 3:
                out[y,x] = [255, 255, 0]
            elif S == 4:
                out[y,x] = [255, 0, 255]

    out = out.astype(np.uint8)

    return out



# Read image
img = cv2.imread("renketsu.png").astype(np.float32)

# connect 4
out = connect_4(img)

# Save result
cv2.imwrite("out.png", out)
cv2.imshow("result", out)
cv2.waitKey(0)
cv2.destroyAllWindows()

输入(renketsu.png):

输出:

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程