Catalog
  1. 1. 如何确定实验数据的圆形?
运用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文件,其实是单通道的数据,我们需要先读取数据

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

再将数据保存为uint8格式

1
img = img.astype(np.uint8)

再保存为灰度图像数据

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

再进行锐化处理

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

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

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

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

1
def find_center(image_ori, num_approxi):
2
    num_size_ori = np.shape(image_ori)[0]
3
    num_size_ori_half = int(num_size_ori/2)
4
5
    # First approximated range of the picture
6
    num_approxi = 200
7
    img = image_ori[num_size_ori_half-num_approxi:num_size_ori_half +
8
                    num_approxi, num_size_ori_half-num_approxi:num_size_ori_half+num_approxi]
9
10
    img = img.astype(np.uint8)
11
    gray = np.array(Image.fromarray(img))
12
13
    # Blur using 3 * 3 kernel.
14
    gray_blurred = cv2.blur(gray, (3, 3))
15
    #gray_blurred =gray
16
    # Apply Hough transform on the blurred image.
17
    detected_circles = cv2.HoughCircles(gray_blurred,
18
                                        cv2.HOUGH_GRADIENT, dp=20, minDist=400, param1=50,
19
                                        param2=30, minRadius=60, maxRadius=90)
20
    # if detected_circles is not None:
21
22
    #     # Convert the circle parameters a, b and r to integers.
23
    #     detected_circles = np.uint16(np.around(detected_circles))
24
25
    #     for pt in detected_circles[0, :]:
26
    #         a, b, r = pt[0], pt[1], pt[2]
27
28
    #         # Draw the circumference of the circle.
29
    #         cv2.circle(img, (a, b), r, (0, 255, 0), 2)
30
31
    #         # Draw a small circle (of radius 1) to show the center.
32
    #         cv2.circle(img, (a, b), 1, (0, 0, 255), 3)
33
    #         cv2.imshow("Detected Circle", img)
34
    #         cv2.waitKey(0)
35
    return detected_circles

效果图为

image-20201224173107821

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

Author: Knifelee
Link: https://knifelees3.github.io/2020/12/22/C_%E6%95%99%E7%A8%8B_Python%E7%9A%84CV2%E5%BA%93%E6%A3%80%E6%B5%8Btiff%E5%9B%BE%E5%BD%A2%E4%B8%AD%E7%9A%84%E5%9C%86%E5%BD%A2/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Donate
  • 微信
  • 支付寶

Comment