欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

图像处理 4 个连接、8 个连接

最编程 2024-04-29 14:27:10
...

一. 定义:

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("../connect4.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-连接数 着色后的图像 ↑

六. 写在最后的话:

    如果您觉得本文对您有所帮助,记得点赞哦!


七. 版权声明:

    未经作者允许,请勿随意转载抄袭,抄袭情节严重者,作者将考虑追究其法律责任,创作不易,感谢您的理解和配合!

推荐阅读