一. 定義:
4-連接數
4-連接數用於顯示像素的狀態和附近像素的狀態。對於中心像素x_0(x,y),它的鄰域定義如下:

像素x_0的鄰域 ↑

4-連接數的計算公式 ↑
S的取值范圍為[0,4]:
① S=0:內部點或孤點
② S=1:端點
③ S=2:連接點
④ S=3:分支點
⑤ S=4:交叉點
對4-連接數得到的不同位置的像素點進行着色,能夠讓我們清晰地觀察到像素點所處的不同位置(可參考本文實驗結果)。
8-連接數:只需要將二值圖像的0和1進行反轉,然后進行和4-連接數一樣的計算即可。
二. 實驗:對圖像進行4-連接數着色
源碼:
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("../connect8.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()
三. 實驗結果:

原圖 ↑

4-連接數 着色后的圖像 ↑
四. 實驗:對圖像進行8-連接數着色
源碼:
import cv2 import numpy as np import matplotlib.pyplot as plt # connect 8 def connect_8(img): # get shape H, W, C = img.shape # prepare temporary _tmp = np.zeros((H, W), dtype=np.int) # get binarize _tmp[img[..., 0] > 0] = 1 # inverse for connect 8 tmp = 1 - _tmp # prepare 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("../connect8.png").astype(np.float32) # connect 8 out = connect_8(img) # Save result cv2.imwrite("out.png", out) cv2.imshow("result", out) cv2.waitKey(0) cv2.destroyAllWindows()
五. 實驗結果:

原圖 ↑

8-連接數 着色后的圖像 ↑
六. 寫在最后的話:
如果您覺得本文對您有所幫助,記得點贊哦!
七. 版權聲明:
未經作者允許,請勿隨意轉載抄襲,抄襲情節嚴重者,作者將考慮追究其法律責任,創作不易,感謝您的理解和配合!