Python-OpenCV 图像处理(十九):霍夫圆检测 (发票印章去除)

时间:2024-05-20 12:23:04
import cv2
import numpy as np
from matplotlib import pyplot as plt

__author__ = "zxsuperstar"
__email__ = "[email protected]"

"""
霍夫圆检测
"""
def detect_circle_demo(image):
    # dst = cv2.cv2.GaussianBlur(image,(3,3),0)  #高斯滤波
    # cv2.imshow("dst",dst)

    #Mean Shift的优点就在于如果是像背景桌面的浅色纹理,
    # 图像分割的过程中相当于将这些小的浮动过滤掉,并且保留相对明显的纸张边缘
    # dst = cv2.bilateralFilter(src=image, d=0, sigmaColor=100, sigmaSpace=15)  #高斯双边滤波
    dst = cv2.pyrMeanShiftFiltering(image,10,100) #  均值偏移滤波
    cimage = cv2.cvtColor(dst,cv2.COLOR_BGRA2GRAY)
    # ret, cimage = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
    # cimage = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY, 3, 5)
    # cimage = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 3, 5)
    cv2.imshow("cimage",cimage)
    circle = cv2.HoughCircles(cimage, cv2.HOUGH_GRADIENT,1,200,param1=50,param2=30,minRadius=0,maxRadius=0)
    if not circle is None:
        circle = np.uint16(np.around(circle))
        print(circle)
        for i in circle[0,:]:
            cv2.circle(image,(i[0],i[1]),i[2],(0,0,255),2)
            # cv2.circle(image, (i[0], i[1]), 2, (255, 0, 0), 2)
            # cv2.namedWindow('circle', cv2.WINDOW_NORMAL)
            cv2.imshow("circle", image)


if __name__ == "__main__":
    src = cv2.imread("./image/fp1.jpg") #blue green red
    # cv2.namedWindow("image", cv2.WINDOW_AUTOSIZE)
    # cv2.namedWindow('image', cv2.WINDOW_NORMAL)
    w ,h = src.shape[0:2]

    image = cv2.resize(src, (0, 0), fx=0.25, fy=0.25, interpolation=cv2.INTER_NEAREST)
    cv2.imshow("image",image)

    detect_circle_demo(image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()


运行结果:

Python-OpenCV 图像处理(十九):霍夫圆检测 (发票印章去除)

Python-OpenCV 图像处理(十九):霍夫圆检测 (发票印章去除)

 

说明:

1.OpenCV的霍夫圆变换函数原型为:HoughCircles(image, method, dp, minDist[, circles[, param1[, param2[, minRadius[, maxRadius]]]]]) -> circles

image参数表示8位单通道灰度输入图像矩阵。

method参数表示圆检测方法,目前唯一实现的方法是HOUGH_GRADIENT。

dp参数表示累加器与原始图像相比的分辨率的反比参数。例如,如果dp = 1,则累加器具有与输入图像相同的分辨率。如果dp=2,累加器分辨率是元素图像的一半,宽度和高度也缩减为原来的一半。

minDist参数表示检测到的两个圆心之间的最小距离。如果参数太小,除了真实的一个圆圈之外,可能错误地检测到多个相邻的圆圈。如果太大,可能会遗漏一些圆圈。

circles参数表示检测到的圆的输出向量,向量内第一个元素是圆的横坐标,第二个是纵坐标,第三个是半径大小。

param1参数表示Canny边缘检测的高阈值,低阈值会被自动置为高阈值的一半。

param2参数表示圆心检测的累加阈值,参数值越小,可以检测越多的假圆圈,但返回的是与较大累加器值对应的圆圈。

minRadius参数表示检测到的圆的最小半径。

maxRadius参数表示检测到的圆的最大半径。

2.OpenCV画圆的circle函数原型:circle(img, center, radius, color[, thickness[, lineType[, shift]]]) -> img

img参数表示源图像。

center参数表示圆心坐标。

radius参数表示圆的半径。

color参数表示设定圆的颜色。

thickness参数:如果是正数,表示圆轮廓的粗细程度。如果是负数,表示要绘制实心圆。

lineType参数表示圆线条的类型。

shift参数表示圆心坐标和半径值中的小数位数。