首页 > 编程问答 >过滤和椭圆拟合噪声图像

过滤和椭圆拟合噪声图像

时间:2024-07-24 04:32:16浏览次数:14  
标签:python opencv matplotlib image-processing

我有如下所示的图像(图 1),我想将两个椭圆拟合到内部和外部形状。

编辑

根据 fmw42 的建议创建新代码

if img is None:
    print("Failed to load the image")
    exit()


gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
masked = cv2.inRange(gray,100,255)
ksize= 15
blurred = cv2.medianBlur(masked,ksize = ksize)
ret,thresh = cv2.threshold(blurred,100,255,cv2.THRESH_BINARY)

def detect_ellipses(img, contours):
    ellipses = []
    for contour in contours:
        relevant_points = np.reshape(contour, (contour.shape[0], 2))
        try:
            ellipse = cv2.fitEllipse(relevant_points)
            print(ellipse)
            ellipses.append(ellipse)
        except:
            pass
            
    return ellipses


# # Apply edge detection to the grayscale image with adjusted parameters
edges = cv2.Canny(thresh, 100, 255)
plt.figure()
plt.imshow(edges)
plt.show()
# # # Find the contours in the edge map
contours, hierarchy = cv2.findContours(
    edges, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

应用 Canny 和拟合后的结果|| |我仍然遇到最终结果中不需要的轮廓的问题。不幸的是,我无法真正过滤掉它们,因为有些形状与所需的形状太接近。 After Canny After Fitting

我一直在使用 OpenCV,并且能够始终拟合内部椭圆。由于我无法完全消除噪音,外部一直很棘手,这会导致不理想的配件(图 2)。目前,我可以通过反复试验来拟合单个图像,但并不理想。

if img is None:
    print("Failed to load the image")
    exit()


gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
kernel = np.ones((5,5),np.uint8)
gray = cv2.morphologyEx(gray, cv2.MORPH_CLOSE, kernel)
ret,thresh = cv2.threshold(gray,65,255,cv2.THRESH_BINARY)
ksize = 15
med=  cv2.medianBlur(thresh, ksize = ksize)

def detect_ellipses(img, contours):
    ellipses = []
    for contour in contours:
        relevant_points = np.reshape(contour, (contour.shape[0], 2))
        try:
            ellipse = cv2.fitEllipse(relevant_points)
            #print(ellipse)
            ellipses.append(ellipse)
        except:
            pass
            
    return ellipses


# # Apply edge detection to the grayscale image with adjusted parameters
edges = cv2.Canny(med, 65, 255)

# # # Find the contours in the edge map
contours, hierarchy = cv2.findContours(
    edges, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

# plt.figure('outer')
# plt.imshow(contours)
# plt.show()

# # # Detect ellipses from the contours
ellipses = detect_ellipses(img, contours)


# # Draw the ellipses on the original image
for ellipse in ellipses:
    try:
        cv2.ellipse(img, ellipse, (0, 255, 0), 2)
        print(ellipse)
    except:
        pass

# #Show the original image with the fitted ellipses
cv2.imshow('Ellipse Detection', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

Figure 1

I have been using OpenCV and am able to consistently fit the inner ellipse. The outer has been tricky due to the noises that I have not been able to remove completely, which cause undesired fittings (Figure 2). Currently, I am able to fit individual images through trial and error, but not ideal.

Figure 2


以下是使用 Python 和 OpenCV 检测图像中两个椭圆(内椭圆和外椭圆)的分步过程。该代码侧重于通过图像处理技术减少不需要的轮廓,从而实现更稳健的椭圆拟合:

1. 加载图像并预处理:

import cv2
import numpy as np
import matplotlib.pyplot as plt

# 读取图像
img = cv2.imread('image.png')
if img is None:
    print("无法加载图像")
    exit()

# 将图像转换为灰度
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 应用中值滤波器以减少噪声
gray = cv2.medianBlur(gray, 5)

2. 创建二值图像:

# 通过自适应阈值处理创建清晰的边缘图
thresh = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, 
                               cv2.THRESH_BINARY_INV, 11, 2)

3. 检测和过滤轮廓:

# 查找轮廓
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# 按区域过滤轮廓,保留较大的轮廓
min_area = 1000  # 根据需要调整此值
filtered_contours = [cnt for cnt in contours if cv2.contourArea(cnt) > min_area]

4. 拟合椭圆:

# 对过滤后的轮廓拟合椭圆
ellipses = []
for cnt in filtered_contours:
    if len(cnt) >= 5:  # 确保至少有 5 个点进行椭圆拟合
        ellipse = cv2.fitEllipse(cnt)
        ellipses.append(ellipse)

5. 绘制结果:

# 在原始图像上绘制椭圆
result_image = img.copy()
for ellipse in ellipses:
    cv2.ellipse(result_image, ellipse, (0, 255, 0), 2)

# 显示结果
cv2.imshow("检测到的椭圆", result_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

说明:

  • 中值滤波器 有助于减少噪声,同时保留边缘。
  • 自适应阈值处理 可以为具有不同照明条件的图像创建更稳健的二值图像。
  • 按区域过滤轮廓 有助于消除与的目标椭圆不对应的微小噪声或不必要的细节。
  • 函数 cv2.fitEllipse() 需要至少 5 个点 才能拟合椭圆。检查每个轮廓的点数可以防止运行时错误。

调整:

  • 根据的图像以及噪声级别和椭圆尺寸,可能需要调整 medianBlur 中的内核大小和 adaptiveThreshold 中的参数。
  • min_area 参数控制要过滤掉的轮廓的大小。根据椭圆的大小进行实验以找到合适的值。

通过仔细微调这些参数,可以提高椭圆检测算法的准确性。

标签:python,opencv,matplotlib,image-processing
From: 78780193

相关文章

  • 如何使用 python 更改资源管理器窗口中的路径?
    没有人知道如何在不使用python打开新实例的情况下更改资源管理器窗口中的当前路径吗?例如,如果用户使用C:\Users\User打开资源管理器窗口。然后我必须将该路径更改为C:\Windows\System32例如。提前致谢。很遗憾,无法直接使用Python更改现有文件资源管理器窗口的......
  • python 以及将数组传递给函数的问题
    我需要求解一些常微分方程$\frac{dy}{dx}=f(x)=x^2ln(x)$并继续在限制0之间创建数组xpt。<=xpt<=2因为我必须小心xpt=0,所以我将函数定义如下deff(x):ifx<=1.e-6:return0.else:returnnp.square(x)*np.log(x)我的调用程序读取Np......
  • 如果 Python 脚本正在使用文件夹,如何在文件资源管理器中进行更改时防止 Windows 的“
    我有一个简单的脚本,显示在QTreeView中的QListView中选择的目录的内容,我想添加打开文件资源管理器的功能,以让用户编辑目录内的内容。但是,添加新的文件夹和文件可以,但删除或移动文件夹或文件会提示“文件夹正在使用”错误:此操作无法完成,因为该文件已在另一个程......
  • 如何使用 Python API 获取每个模型的活跃用户列表、最后登录信息
    我想通过PythonAPI获取我的dbt项目的所有模型中的活动或非活动用户列表。这可能吗?我尝试列出模型,但无法获取用户信息,如用户名、项目、以及上次活动或上次登录。不幸的是,dbt本身并不跟踪你所寻找的用户活动数据(最后登录、活跃用户等)。dbt的主要功能是转换数据,而不......
  • Python tkinter 窗口不断关闭,我不知道为什么
    我正在尝试制作一个有趣的小程序,其中每小时左右就会有一只毛茸茸的动物走过屏幕。我有一个主窗口,它启动一个循环,每小时左右播放一次动画/声音,但是在口袋妖怪第一次完成行走后,整个程序就会结束。我认为这可能与我设置tkinter窗口的方式有关,但我无法弄清楚。我认为在这里包含......
  • 用于自动访问 MongoDB Atlas CLI 的 Python 脚本
    我想编写一个Python脚本,以便普通用户可以访问他的数据库并从他的终端执行CRUD操作。我正在查看官方文档,但我有点迷失。有人可以给我指点基本教程来开始吗?当然,以下是如何构建Python脚本来访问MongoDBAtlasCLI的基本教程:先决条件:MongoDBAtlas......
  • Python实现简单学生登陆系统
     代码:importhashlibclassStudent:def__init__(self,username,password):#初始化学生对象,存储用户名和加密后的密码self.username=usernameself.password=hashlib.sha256(password.encode()).hexdigest()defcheck_passwo......
  • python猜数字游戏
    好的,下面是一个简单的小游戏代码示例,使用Python编写。这个游戏是一个猜数字游戏,玩家需要猜一个1到100之间的随机数。importrandomdefguess_number_game():print("欢迎来到猜数字游戏!")print("我已经想好了一个1到100之间的数字,请你猜一猜。")secret_num......
  • 【Python正则表达式】:文本解析与模式匹配
    文章目录1.正则表达式2.re模块3.修饰符3.元字符3-1字符匹配元字符3-2重复次数限定元字符3-3字符集合匹配元字符3-4分组元字符3-5边界匹配元字符3-6字符类别匹配元字符4.技巧4-1贪婪与非贪婪5.案例1.正则表达式正则表达式面向什么样的问题?1、判断一个字......
  • 仅需增加2行代码,Python量化策略速度提升20+倍!
    今天分享一个Python量化策略加速的小技巧,不用修改原有代码,只需在原有代码里新增2行,策略执行速度便可能提高20+倍,正文开始~现如今,无论是入门量化投资,还是做数据分析、机器学习和深度学习,Python成为了首选编程语言,直观的原因就是容易上手和资源丰富,但Python有个根深蒂固的标签,......