前面为了说明原理,采用自己实现的积分图像的计算方法,其实这种方法也是OpenCV里实现的算法,那在OpenCV里有没有相同的实现函数呢?这是有的,它就是cv2.integral函数,它的定义如下:
第一个参数src,可以使灰度图或RGB彩色图,单通道和三通道均可作为输入,但每个通道的精度必须是8位int或32位、64位浮点型;
第二个参数sum,积分图,若输入src是灰度图,则积分图也是灰度图,若输入src是RGB三通道图,则积分图sum也是RGB三通道彩色。sum的图像深度是32位整型或32位、64位浮点型,这取决于第三个参数sdepth的定义;
第三个参数sqsum,计算像素点平方积分。
第四个参数tilted, 旋转45度图像的积分。
第五个参数sdepth,定义积分图的深度(depth),32位整型或者32位、64位浮点型。注意图像的深度跟图像的通道数是无关的,相关概念可以参看这里:Opencv Mat矩阵中data、size、depth、elemSize、step等属性的理解 ;
所以在使用sum之前,声明即可,可以不事先定义Mat矩阵的大小和数据类型。
因此,可以把前面的例子改为这样:
#python 3.7.4,opencv4.1
#蔡军生 https://blog.csdn.net/caimouse/article/details/51749579
#
import cv2
import numpy as np
#均值平滑
def MeanBlur(image,WinSize):
wH = (WinSize[0]-1)//2
wW = (WinSize[1]-1)//2
imagepad = cv2.copyMakeBorder(image,wH,wH,wW,wW, borderType = cv2.BORDER_DEFAULT)
imgIt = cv2.integral(imagepad)#积分图像
h,w = image.shape[:2]
out = np.zeros(image.shape, np.float32)
r,c = 0,0
for y in range(wH, wH+h, 1):
for x in range(wW, wW+w, 1):
out[r][c] = (imgIt[y+wH+1][x+wW+1] + imgIt[y-wH][x-wW] -
imgIt[y+wH+1][x-wW] - imgIt[y-wH][x+wW+1])/(WinSize[0]*WinSize[1])
c += 1
r += 1
c = 0
return out
#图片的路径
imgname = "gauss1.jpg"
#读取图片
image = cv2.imread(imgname, cv2.IMREAD_GRAYSCALE)
#图片的高度和宽度
h,w = image.shape[:2]
print('imagesize={}-{}'.format(w,h))
#显示原图
cv2.imshow("Image",image)
#平滑
out = MeanBlur(image,(5,5))
out = out.astype(np.uint8)
cv2.imshow("out",out)
cv2.waitKey(0)
cv2.destroyAllWindows()
结果输出如下:
输入图片
输出图片
https://blog.csdn.net/caimouse/article/details/51749579
转载:https://blog.csdn.net/caimouse/article/details/100985983
查看评论