运用Python的CV2库检测tiff图形中的圆形

运用Python的CV2库检测tiff图形中的圆形

如何确定实验数据的圆形?

实验数据保存为Tiff文件,其实就是一个强度分布的矩阵,与实际的图片是有区别的。

标签图像文件格式(Tag Image File Format,TIFF)是一种灵活的位图格式,主要用来存储包括照片和艺术图在内的图像,最初由Aldus公司与微软公司一起为PostScript打印开发。TIFF与JPEGPNG一起成为流行的高位彩色图像格式。TIFF格式在业界得到了广泛的支持,如Adobe公司的Photoshop、The GIMP Team的GIMP、Ulead PhotoImpact和Paint Shop Pro等图像处理应用、QuarkXPressAdobe InDesign这样的桌面印刷和页面排版应用,扫描、传真、文字处理、光学字符识别和其它一些应用等都支持这种格式。从Aldus获得了PageMaker印刷应用程序的Adobe公司控制着TIFF规范。

我们需要一个检测圆的算法来实现,我主要参考了这两个教程
Detecting Circles in Images using OpenCV and Hough Circles
Circle Detection using OpenCV | Python

但是我需要再做更改的是:

  • 上面给的例子都是导入一个颜色图,具有RGB三个通道的数据,我们用cv2库可以轻松实现不同颜色通道的表示方法。

  • 实验数据是tiff文件,其实是单通道的数据,我们需要先读取数据

np.array(plt.imread(Path+Filename))

再将数据保存为uint8格式

img = img.astype(np.uint8)

再保存为灰度图像数据

gray = np.array(Image.fromarray(img))

再进行锐化处理

gray_blurred = cv2.blur(gray, (3, 3))

最后运用函数cv2.HoughCircles来检测

    detected_circles = cv2.HoughCircles(gray_blurred,
                                        cv2.HOUGH_GRADIENT, dp=20, minDist=400, param1=50,
                                        param2=30, minRadius=60, maxRadius=90)

可以定义一个函数完成这些操作。

def find_center(image_ori, num_approxi):
    num_size_ori = np.shape(image_ori)[0]
    num_size_ori_half = int(num_size_ori/2)

    # First approximated range of the picture
    num_approxi = 200
    img = image_ori[num_size_ori_half-num_approxi:num_size_ori_half +
                    num_approxi, num_size_ori_half-num_approxi:num_size_ori_half+num_approxi]

    img = img.astype(np.uint8)
    gray = np.array(Image.fromarray(img))

    # Blur using 3 * 3 kernel.
    gray_blurred = cv2.blur(gray, (3, 3))
    #gray_blurred =gray
    # Apply Hough transform on the blurred image.
    detected_circles = cv2.HoughCircles(gray_blurred,
                                        cv2.HOUGH_GRADIENT, dp=20, minDist=400, param1=50,
                                        param2=30, minRadius=60, maxRadius=90)
    # if detected_circles is not None:

    # # Convert the circle parameters a, b and r to integers.
    # detected_circles = np.uint16(np.around(detected_circles))

    # for pt in detected_circles[0, :]:
    # a, b, r = pt[0], pt[1], pt[2]

    # # Draw the circumference of the circle.
    # cv2.circle(img, (a, b), r, (0, 255, 0), 2)

    # # Draw a small circle (of radius 1) to show the center.
    # cv2.circle(img, (a, b), 1, (0, 0, 255), 3)
    # cv2.imshow("Detected Circle", img)
    # cv2.waitKey(0)
    return detected_circles

效果图为

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pzpXGAcV-1612590186410)(https://raw.githubusercontent.com/knifelees3/my_pictures/master/picgoup/image-20201224173107821.png)]

发现效果还是可以的,自己还是得微调才行。

    原文作者:小李探花s3
    原文地址: https://blog.csdn.net/sinat_31983447/article/details/113723901
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞