小言_互联网的博客

在OpenCV里实现均值平滑4

496人阅读  评论(0)

前面为了说明原理,采用自己实现的积分图像的计算方法,其实这种方法也是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
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场