Python图片数据处理怎么样图找白色区域?

这样一张9000*7000像素的图片该怎么样实现找出两个圆的区域。求大佬

# -*- coding: gbk -*-

import cv2
import numpy as np

image_path = r"C:\Users\17607\Desktop\smls pictures\Pic_20231122151507973.bmp"

def row_method(src):
    image_width = src.shape[1]
    image_height = src.shape[0]
    image = np.array(src)
    cimage = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)  # 灰度图
    circles = cv2.HoughCircles(cimage, cv2.HOUGH_GRADIENT, 1, 40, param1=50, param2=30, minRadius=0, maxRadius=0)
    circles = np.uint16(np.around(circles))  # 取整
    for i in circles[0, :]:
        center_x, center_y, radius = i[0], i[1], i[2]
        if 0 <= center_x - radius < image_width and 0 <= center_x + radius < image_width and \
               0 <= center_y - radius < image_height and 0 <= center_y + radius < image_height:
                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.putText(image, "param1=250, param2=58", (20, 20), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 0, 255), 2)
    cv2.imshow("row_circles", image)


src = cv2.imread(image_path)  # 读取图片位置
resized_image = cv2.resize(src, (src.shape[1] // 10, src.shape[0] // 10))
cv2.namedWindow("input image", cv2.WINDOW_AUTOSIZE)
cv2.imshow("input image", resized_image)
threshold_OTSU_method(resized_image)
row_method(resized_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

这个只能得到image.png有很多没用信息希望能得到这两个区域。。求大佬

阅读 563
avatarAI BotBETA

根据你提供的代码和图片,看起来你正在尝试使用霍夫圆变换(Hough Circle Transform)来检测图片中的圆。然而,你遇到的问题是检测到了过多的圆形,而你只关心两个特定的圆。

要解决这个问题,你可以在检测到圆之后,检查这些圆的半径是否在你的预期范围内。只有当圆的半径在你期望的范围内时,你才在原图上画出这个圆和它的圆心。

以下是修改后的代码:

# -*- coding: gbk -*-

import cv2
import numpy as np

image_path = r"C:\Users\17607\Desktop\smls pictures\Pic_20231122151507973.bmp"
expected_radius_min = 100  # 预期的最小半径
expected_radius_max = 200  # 预期的最大半径

def row_method(src):
    image_width = src.shape[1]
    image_height = src.shape[0]
    image = np.array(src)
    cimage = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)  # 灰度图
    circles = cv2.HoughCircles(cimage, cv2.HOUGH_GRADIENT, 1, 40, param1=50, param2=30, minRadius=expected_radius_min, maxRadius=expected_radius_max)
    circles = np.uint16(np.around(circles))  # 取整
    for i in circles[0, :]:
        center_x, center_y, radius = i[0], i[1], i[2]
        if 0 <= center_x - radius < image_width and 0 <= center_x + radius < image_width and \
               0 <= center_y - radius < image_height and 0 <= center_y + radius < image_height:
            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.putText(image, "param1=250, param2=58", (20, 20), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 0, 255), 2)
    cv2.imshow("row_circles", image)

src = cv2.imread(image_path)  # 读取图片位置
resized_image = cv2.resize(src, (src.shape[1] // 10, src.shape[0] // 10))
cv2.namedWindow("input image", cv2.WINDOW_AUTOSIZE)
cv2.imshow("input image", resized_image)
row_method(resized_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这个修改后的代码中,我增加了两个变量expected_radius_minexpected_radius_max,用于指定你期望的圆的半径范围。只有当检测到的圆的半径在这个范围内时,才会在原图上画出这个圆和它的圆心。这样就可以过滤掉那些不必要的圆形,只保留你关心的两个圆。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题