极值法,阈值法,灰度质心法提取线激光

提取线激光的几种基础方法

极值法:

首先将图像转化为灰度图,然后按行寻找每一行的亮度最大值,在这里还加入了一个阈值threshod,也可以不加

Mat Max_Value(Mat Src)
{
    Mat img = Src.clone();
    Mat Laser_Line(Src.rows, Src.cols, CV_8UC1);
    cvtColor(Src, img, CV_BGR2GRAY);
    int h = img.rows, w = img.cols;
    int index = 0;
    //这里设置一个阈值,每一行的最大值不一定是激光线,大于这个阈值才认为是激光线
    int threshod = 170;
    for (int i = 0; i < h; i++)
    {
        double max_row = 0;
        for (int j = 0; j < w; j++)
        {
            if (img.at<uint8_t>(i, j) > max_row)
            {
                max_row = img.at<uint8_t>(i, j);
                index = j;
            }
        }
        if (max_row > threshod)
            Laser_Line.at<uint8_t>(i, index) = 255;
    }
    imshow("极值法", Laser_Line);
    waitKey(0);
    return Laser_Line;
}

阈值法:

从图像的左右两侧向中间寻找激光条的左右边界,然后找到左右边界的中点即为激光线的中心

Mat Fixed_Threshold(Mat Src)
{
    Mat img = Src.clone();
    Mat Laser_Line(Src.rows, Src.cols, CV_8UC1);
    int index1 = 0;
    int index2 = 0;
    int threshod = 170;
    int h = img.rows, w = img.cols;
    cvtColor(img, img, CV_BGR2GRAY);
    //threshold(img, img, threshod, 255, THRESH_BINARY);
    for (int i = 0; i < h; i++)
    {
        //从左侧开始向右查找
        for (int j = 0; j < w; j++)
        {
            if ((img.at<uint8_t>(i, j) > threshod))
            {
                index1 = j;
                cout << i << " index1: " << index1 << " ";
                break;
            }
        }
        //从右侧开始向左查找
        for (int j = w - 1; j >= 0; j--)
        {
            if ((img.at<uint8_t>(i, j) > threshod))
            {
                index2 = j;
                cout << "index2: " << index2 << endl;
                break;
            }
        }
        if ((index1 != 0) && (index2 != 0) && (abs(index1 - index2) < 50))
            Laser_Line.at<uint8_t>(i, (index1 + index2) / 2) = 255;
        index1 = 0;
        index2 = 0;
    }
    imshow("阈值法", Laser_Line);
    waitKey(0);
    return Laser_Line;
}

灰度质心法:

将图像转为灰度图并二值化,把灰度值看作质量,每一行的重心作为激光线的中心

Mat Gray_Weighted(Mat Src)
{
    Mat img = Src.clone();
    Mat Laser_Line(Src.rows, Src.cols, CV_8UC1);
    int threshod = 150;
    int h = img.rows, w = img.cols;
    cvtColor(img, img, CV_BGR2GRAY);
    medianBlur(img, img, 3);
    threshold(img, img, threshod, 255, 0);
    for (int i = 0; i < img.rows; i++)
    {
        long long sxp = 0, sp = 0, xpos;
        for (int j = 0; j < img.cols; j++)
        {
            sxp += (j*(long long)(img.at<uint8_t>(i, j)));
            sp += (long long)(img.at<uint8_t>(i, j));
        }
        if (sp)
        {
            xpos = sxp / sp;//xpos即为每一行的重心坐标
            //xpos就是这一行的重心纵坐标
            Laser_Line.at<uint8_t>(i, xpos) = 255;
        }
    }
    imshow("灰度质心法", Laser_Line);
    waitKey(0);
    return Laser_Line;
}

 

激光条纹中心提取是图像处理和计算机视觉中的一个重要任务,特别是在激光散斑测量、光学测量等技术中。极值是一种简单的提取激光条纹中心的方,它依赖于图像中条纹的强度分布,通常认为条纹强度的局部最大值或最小值对应于条纹的中心位置。 下面是一个简单的Python代码示例,展示如何使用极值提取激光条纹中心。这个例子使用了图像处理库OpenCV来读取图像,并通过寻找局部极值来确定条纹中心。 ```python import cv2 import numpy as np # 读取图像 image = cv2.imread('laser_stripe.jpg', cv2.IMREAD_GRAYSCALE) # 对图像进行高斯模糊,以便更好地识别条纹中心 blurred_image = cv2.GaussianBlur(image, (5, 5), 0) # 寻找局部最大值点,即条纹中心 # minVal和maxVal是局部区域的最小和最大值 # minLoc和maxLoc是对应的坐标位置 minVal, maxVal, minLoc, maxLoc = cv2.minMaxLoc(blurred_image) # 我们这里关注的是局部最大值点,即maxLoc print("条纹中心的位置:", maxLoc) # 可视化结果 result = np.zeros_like(image) cv2.circle(result, maxLoc, 3, (255, 0, 0), -1) cv2.imshow('Laser Stripe Center', result) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在使用这段代码之前,请确保你已经安装了OpenCV库,可以通过`pip install opencv-python`来安装。 这段代码中,我们首先读取一张表示激光条纹的灰度图像,然后使用高斯模糊来平滑图像,使得条纹更易于通过局部极值来识别。之后,我们使用`cv2.minMaxLoc`函数找到图像中的局部最大值点,这个点即代表了我们感兴趣的激光条纹的中心位置。最后,我们在原始图像上绘制一个蓝色的圆点来标记条纹中心的位置,并显示出来。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值