灰度重心法原理与实现

转自:https://blog.csdn.net/moses1213/article/details/44679603

灰度重心法提取激光光条纹中心其实是将光条纹截面的灰度值分布中的质心记作为光条纹的中心。
在一列线激光中先利用极值法求取光强最大的一点gmax,然后确定一个阀值K=gmax-g(g取10-20),在阈值两边判断大于K的元素,求出其重心位置作为光条纹的中心。

灰度重心法原理与实现_第1张图片
在线激光条纹的灰度分布图中,假设所有大于阈值K的点的像素坐标为Ui(i=0,1,2…)其相应的灰度值则为gi(i=0,1,2…),则光心的位置为:
灰度重心法原理与实现_第2张图片
由灰度重心法来求取线激光光条纹的中心,每一列线激光条纹的阈值都是不同的,即使线激光灰度分布不均匀或者发生了改变,也不会对线激光光条纹中心位置的确定带来很大的误差,提高了重心提取的精度。

Python代码:

import cv2
import numpy as np
#图像预处理
img = cv2.imread("D:\opencv_camera\digits\shiyan2\\20.jpg")
print(img.shape)
img=img[100:400,450:1000]
cv2.imshow('img',img)
cv2.waitKey(0)
emptyImage3=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret1,th1 = cv2.threshold(emptyImage3,100,255,cv2.THRESH_BINARY)
cv2.imshow('img',th1)
cv2.waitKey(0)
#灰度重心法提取光条纹公式函数
def Cvpointgray(img):
    x=[]
    for i in range(img.shape[1]):
        x0=0;y0=0
        for j in range(1,img.shape[0]):
            x0=x0+img[j,i]
            y0=y0+img[j,i]*j
        y=y0/x0
        y=round(y)
        x.append(y)
    return x
print(len(Cvpointgray(th1)))
print(Cvpointgray(th1))
print(sum(Cvpointgray(th1))/550)

Opencv代码C++:

CvPoint grayCenter(IplImage* TheImage)  
{  
    //灰度重心法求质心  
    CvPoint Center;  
    int i, j;  
    CvScalar cs = cvSum(TheImage);  
    Center.x = Center.y = 0;  
    double x = 0;  
    double y = 0;  
    for(i = 0;i < TheImage->width;i++)  
    {  
        for(j = 0; j < TheImage->height;j++)  
        {  
            CvScalar s = cvGet2D(TheImage, j,i);  
            x += i*s.val[0]/cs.val[0];  
            y += j*s.val[0]/cs.val[0];  
        }  
    }  
    Center.x = cvRound(x);  
    Center.y = cvRound(y);  
  
    return Center;  
} 

你可能感兴趣的:(机器视觉,opencv)