请根据4−连接数将renketsu.png
上色。
4−连接数可以用于显示附近像素的状态。通常,对于中心像素x0(x,y)不为零的情况,邻域定义如下:
x4(x−1,y−1)x5(x−1,y)x6(x−1,y+1)x3(x,y−1)x0(x,y)x7(x,y+1)x2(x+1,y−1)x1(x+1,y)x8(x+1,y+1)
这里,4−连接数通过以下等式计算:
S=(x1–x1 x2 x3)+(x3–x3 x4 x5)+(x5–x5 x6 x7)+(x7–x7 x8 x1)
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()
Python
输入(renketsu.png):
输出: