一.积分图实现注意的点
积分图的原理就不解释了,这次主要实现通过Python使用OpenCV模块来完成积分图。看了网上的一些积分图实现,python语言的实现效果不是很好,参考了一篇C++的积分图实现,了解了积分图像的输出数组的尺寸为必须为(w +1)x(h+1),不能是wxh,这是第一点。第二点就是归一化时重新建一个result数组作为保存。否则可能会有一些内存的问题,积分图只有白色。第三点是图像的类型要和后面的数据类型相对应,是灰度图像就要用对应的数据类型,具体看参考文献[3]的解释。
二.代码实现
import cv2
import numpy as np
filename = 'D:/Car_Identify/papers_for_edge/sobel_ver.jpg'
image = cv2.imread(filename, cv2.IMREAD_GRAYSCALE)
# print(image)
cv2.imshow('origin', image)
h, w = image.shape[:2] # 把图片2像素的行数,列数以及通道数返回给rows,cols,channels
sum = np.zeros((h + 1, w + 1), dtype=np.float32) # 创建指定大小的数组,数组元素以 0 来填充:
imageIntegral = cv2.integral(image, sum, cv2.CV_32FC1) # 计算积分图,输出是sum
result = np.zeros((h + 1, w + 1), dtype=np.uint8)
cv2.normalize(imageIntegral, result, 0, 255, cv2.NORM_MINMAX, cv2.CV_8UC1) # 归一化处理
cv2.imshow("Image", result)
cv2.imwrite("D:/Car_Identify/papers_for_edge/integral_result.jpg", result)![在这里插入图片描述](https://img-blog.csdnimg.cn/20190606180108399.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ExNTIwNjA4NzAxMw==,size_16,color_FFFFFF,t_70)
cv2.waitKey()
备注: np.uint8 指unsigned int 8位数
cv2.CV_8UC1 指 unsigned 8位数,单通道
cv2.CV_32FC1 指 float 32位数,单通道
三.实现结果
原图
积分图
四.参考文献
[1]https://blog.csdn.net/xueying_key/article/details/86411806
[2]https://blog.csdn.net/qq_27396861/article/details/88377812
[3]https://blog.csdn.net/lisarer/article/details/80415600