当前位置: 首页 > 知识库问答 >
问题:

使用opencv计算质心

沈成天
2023-03-14

我有一个多个圆圈的图像,圆圈内有热点区域,具有高强度(高像素值)和冷点区域(低像素值)。我想用Python中的OpenCV计算每个圆的加权质心。我正在使用这段代码:

im2, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
for c in contours:
     # calculate moments for each contour
     M = cv2.moments(c)

     # calculate x,y coordinate of center
     if M["m00"] != 0:
         cX = int(M["m10"] / M["m00"])
         cY = int(M["m01"] / M["m00"])
      else:
         cX, cY = 0, 0

好的,这段代码只需获取二值图像,提取所有圆,并找到每个圆的轮廓。

问题是,我需要找到RGB/灰度图像(考虑像素强度)的加权质心,而不是二值图像。我该怎么做?

非常感谢。

共有2个答案

慕胡媚
2023-03-14

@yapws87答案的一些修正:

import numpy as np
import cv2

# create a meshgrid for coordinate calculation
r,c = np.shape(ori_img)
r_ = np.linspace(0,r,r+1)
c_ = np.linspace(0,c,c+1)
x_m, y_m = np.meshgrid(c_, r_, sparse=False, indexing='xy')


im2, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)


for c in contours:
     # Get the boundingbox
     x,y,w,h = cv2.boundingRect(c)

     # calculate x,y coordinate of center
     # Get the corresponding roi for calculation
     weights = ori_img[y:y+h,x:x+w]
     roi_grid_x = x_m[y:y+h,x:x+w]
     roi_grid_y = y_m[y:y+h,x:x+w]
     
     # get the weighted sum
     weighted_x = weights * roi_grid_x
     weighted_y = weights * roi_grid_y
     
     cx = np.sum(weighted_x) / np.sum(weights)
     cy = np.sum(weighted_y) / np.sum(weights)  
屠兴旺
2023-03-14

下面是一种python伪代码解决方案。该代码用于计算质心的加权中心。在计算中,图像的强度级别用作权重。因此,强度越高,重量越高。

为了简化计算过程,我们需要将x坐标和y坐标的网格划分为原始图像的大小。x和y坐标的加权平均值将给出加权质心

import numpy as np
import cv2

# create a meshgrid for coordinate calculation
r,c = np.shape(ori_img)
r_ = np.linspace(0,r,r+1)
c_ = np.linspace(0,c,c+1)
x_m, y_m = np.meshgrid(c_, r_, sparse=False, indexing='ij')


im2, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)


for c in contours:
     # Get the boundingbox
     x,y,w,h = cv2.boundingRect(c)

     # calculate x,y coordinate of center
     # Get the corresponding roi for calculation
     weights = ori_img[y:y+h,x:x+w]
     roi_grid_x = x_m[y:y+h,x:x+w]
     roi_grid_y = y_m[y:y+h,x:x+w]

     # get the weighted sum
     weighted_x = weights * roi_grid_x
     weighted_y = weights * roi_grid_y

     cx = np.sum(weighted_x) / np.sum(weights)
     cy = np.sum(roi_grid_y) / np.sum(weights)  
 类似资料:
  • 我试着用一个大整数来计算地球的质量,但实际上有些东西并没有加起来。 我用来计算地球质量的公式是:M=ar2/G=5.98×1024kg。a是重力加速度(9.8 m/s平方),r是地球半径((6.4)*(10^6)),Big-G((6.673)*(10^-11))是重力常数。 我应该得到的值是:5.97219×10^24 kg=597219000000000000000000000000000000

  • 我有一个小立方体,它的表面有n个(你可以假设n=4)个可分辨的点。这些点被编号(1-N),并形成一个坐标空间,其中点#1是原点。 现在我用一个跟踪相机来获取这些点的坐标,相对于相机的坐标空间。这意味着我现在有n个向量从相机的原点指向立方体的表面。 有了这些信息,我试图计算仿射变换矩阵(旋转+平移),它代表了这两个坐标空间之间的变换。平移部分是相当琐碎的,但我正在纠结于旋转矩阵的计算。 在OpenC

  • 问题内容: 我可以使用下面显示的代码找到匹配的功能。我想计算两个图像之间的百分比相似度。我是OpenCV的新手。任何帮助将不胜感激。 是否有其他可用于相同目的的库? 问题答案: 我发现两个库pHash和pdiff提供了我想要的东西。我将评估它们的性能以及与我的代码的兼容性,并选择最佳的代码。

  • 问题内容: 我试图分别从ArrayList的点加起来所有x和y coordiantes。 我如何找到质心? 问题答案:

  • 问题内容: 我在Python中具有以下测试代码以读取,设置阈值和显示图像: 我想计算带有特定标签(例如黑色)的图像内像素的数量。我怎样才能做到这一点 ?我看了OpenCV的教程,但没有找到任何帮助:-( 谢谢! 问题答案: 对于黑色图像,您将获得像素总数(行*列),然后从得出的结果中减去它。 对于其他值,您可以创建一个遮罩,该遮罩用于返回显示所需颜色/标签/值的所有位置的二进制遮罩,然后用于计算其

  • 问题内容: 我正在尝试计算素数,已经完成了。但是我只想计算和打印第n个质数(用户输入),而计算其余的(不会打印),只会打印第n个质数。 到目前为止,这是我写的内容: 这是我编写的用于计算从1到n的质数的程序。但是,我希望它仅显示第n个质数, 我想做的是每次进行int计数并对其进行 处理,当count == n时,它会打印出该数字,但是我不太清楚如何降落。 问题答案: 为了计算第n个素数,我知道两个