我是OpenCV的新手,现在我正在制作一个与图像处理相关的高级项目。我有一个问题:我可以使用OpenCV的某些功能制作水平或垂直直方图吗? 谢谢,
张庭
答案 0 :(得分:6)
The most efficient这样做的方法是使用cvReduce函数。有一个参数可以选择是否需要水平投影或垂直投影。
答案 1 :(得分:1)
根据您在评论中提供的链接,我相信您正在尝试这样做。
您想要创建一个包含n个元素的数组,其中n是输入图像中的列数。数组的第n个元素的值是第n列中所有像素的总和。
您可以通过循环输入图像的列来计算此数组,使用cvGetSubRect访问该列中的像素,使用cvSum对这些像素求和。
这是一些Python代码,假设是灰度图像:
import cv
def verticalProjection(img):
"Return a list containing the sum of the pixels in each column"
(w,h) = cv.GetSize(img)
sumCols = []
for j in range(w):
col = cv.GetSubRect(img, (j,0,1,h))
sumCols.append(cv.Sum(col)[0])
return sumCols
答案 2 :(得分:1)
更新carnieri答案(某些cv功能今天无效)
import numpy as np
import cv2
def verticalProjection(img):
"Return a list containing the sum of the pixels in each column"
(h, w) = img.shape[:2]
sumCols = []
for j in range(w):
col = img[0:h, j:j+1] # y1:y2, x1:x2
sumCols.append(np.sum(col))
return sumCols
问候。
答案 3 :(得分:0)
在Python中使用cv2.reduce
和OpenCV 3的示例:
import numpy as np
import cv2
img = cv2.imread("test_1.png")
x_sum = cv2.reduce(img, 0, cv2.REDUCE_SUM, dtype=cv2.CV_32S)
y_sum = cv2.reduce(img, 1, cv2.REDUCE_SUM, dtype=cv2.CV_32S)