Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3657182
  • 博文数量: 365
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 2522
  • 用 户 组: 普通用户
  • 注册时间: 2019-10-28 13:40
文章分类

全部博文(365)

文章存档

2023年(8)

2022年(130)

2021年(155)

2020年(50)

2019年(22)

我的朋友

分类: Python/Ruby

2021-05-11 16:29:20

# -*- coding: utf-8 -*-

'''

作者 : 丁毅

开发时间 : 2021/5/9 16:30

'''

import cv2

import numpy as np

# 图像细化

def VThin(image, array):

    rows, cols = image.shape

    NEXT = 1

    for i in range(rows):

        for j in range(cols):

            if NEXT == 0:

                NEXT = 1

            else:

                M = int(image[i, j - 1]) + int(image[i, j]) + int(image[i, j + 1]) if 0 < j < cols - 1 else 1

                if image[i, j] == 0 and M != 0:

                    a = [0]*9

                    for k in range(3):

                        for l in range(3):

                            if -1 < (i - 1 + k) < rows and -1 < (j - 1 + l) < cols and image[i - 1 + k, j - 1 + l] == 255:

                                a[k * 3 + l] = 1

                    sum = a[0] * 1 + a[1] * 2 + a[2] * 4 + a[3] * 8 + a[5] * 16 + a[6] * 32 + a[7] * 64 +  a[8] * 128

                    image[i, j] = array[sum]*255

                    if array[sum] == 1:

                        NEXT = 0

    return image

def HThin(image, array):

    rows, cols = image.shape

    NEXT = 1

    for j in range(cols):

        for i in range(rows):

            if NEXT == 0:

                NEXT = 1

            else:

                M = int(image[i-1, j]) + int(image[i, j]) + int(image[i+1, j]) if 0 < i < rows-1 else 1

                if image[i, j] == 0 and M != 0:

                    a = [0]*9

                    for k in range(3):

                        for l in range(3):

                            if -1 < (i-1+k) < rows and -1 < (j-1+l) < cols and image[i-1+k, j-1+l] == 255:

                                a[k*3+l] = 1

                    sum = a[0]*1+a[1]*2+a[2]*4+a[3]*8+a[5]*16+a[6]*32+a[7]*64+a[8]*128

                    image[i, j] = array[sum]*255

                    if array[sum] == 1:

                        NEXT = 0

    return image

array = [0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1,\

         1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1,\

         0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1,\

         1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1,\

         1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\

         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\

         1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1,\

         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\

         0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1,\

         1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1,\

         0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1,\

         1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,\

         1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\

         1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,\

         1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0,\

         1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0]

# 显示灰度图

img = cv2.imread(r"C:\Users\pc\Desktop\vas0.png",0)

cv2.imshow("img1",img)

# 自适应阈值分割

img2 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 17, 4)

cv2.imshow('img2', img2)

# 图像反色

img3 = cv2.bitwise_not(img2)

cv2.imshow("img3", img3)

# 图像扩展

img4 = cv2.copyMakeBorder(img3, 1, 1, 1, 1, cv2.BORDER_REFLECT)

cv2.imshow("img4", img4)

contours, hierarchy = cv2.findContours(img4, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)

# 消除小面积

img5 = img4

for i in range(len(contours)):

    area = cv2.contourArea(contours[i])

    if (area < 80) | (area > 10000):

        cv2.drawContours(img5, [contours[i]], 0, 0, -1)

cv2.imshow("img5", img5)

num_labels, labels, stats, centroids = cv2.connectedComponentsWithStats(img5, connectivity=8, ltype=None)

# print(stats)

s = sum(stats)

img6 = np.ones(img5.shape, np.uint8) * 0

for (i, label) in enumerate(np.unique(labels)):

    # 货币符号如果是背景,忽略

    if label == 0:

        # print("[INFO] label: 0 (background)")

        continue

    numPixels = stats[i][-1]

    div = (stats[i][4]) / s[4]

    # print(div)

    # 判断区域是否满足面积要求

    if round(div, 3) > 0.002:

        color = 255

        img6[labels == label] = color

cv2.imshow("img6", img6)

# 图像反色

img7 = cv2.bitwise_not(img6)

# 图像细化

for i in range(10):

    VThin(img7, array)

    HThin(img7, array)

cv2.imshow("img7",img7)

# 边缘检测

img8 = cv2.Canny(img6, 80, 255)

cv2.imshow("img8", img8)

# 使灰度图黑白颠倒

img9 = cv2.bitwise_not(img8)

cv2.imshow("img9", img9)

cv2.waitKey(0)

阅读(1974) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~