OpenCV(python)一键入门--第八篇(边缘保留滤波算法 和 图像积分图)
【摘要】 边缘保留滤波算法 和 图像积分图
前面介绍的卷积模糊,有一个问题就是,模糊过后的图像,其边缘信息受到破坏。所以有了今天的边缘保留滤波算法:
1:双边滤波
cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace[, dst[, borderType]]) → dst
参数解释:
-
src:输入图像
-
d:过滤时周围每个像素领域的直径
-
sigmaColor:在color space中过滤sigma。参数越大,临近像素将会在越远的地方mix。
-
sigmaSpace:在coordinate space中过滤sigma。参数越大,那些颜色足够相近的的颜色的影响越大。
import cv2 as cv
import numpy as np
#边缘保留滤波算法--高斯双边模糊
#也可以用于去水印
src = cv.imread("ma.jpg")
cv.imshow("input", src)
h, w = src.shape[:2]
dst = cv.bilateralFilter(src, 0, 100, 10)
cv.imshow("dst",dst)
cv.waitKey(0)
cv.destroyAllWindows()
效果如下图:
2:均值迁移模糊
cv.pyrMeanShiftFiltering(src, sp, sr[, dst[, maxLevel[, termcrit]]]) -> dst
src参数表示输入图像,8位,三通道图像。
sp参数表示漂移物理空间半径大小。
sr参数表示漂移色彩空间半径大小。
dst参数表示和源图象相同大小、相同格式的输出图象。
maxLevel参数表示金字塔的最大层数。
termcrit参数表示漂移迭代终止条件。
import cv2 as cv
import numpy as np
#边缘保留滤波算法--均值迁移模糊
src = cv.imread("ma.jpg")
cv.imshow("input", src)
h, w = src.shape[:2]
dst = cv.pyrMeanShiftFiltering(src, 15, 30, termcrit=(cv.TERM_CRITERIA_MAX_ITER+cv.TERM_CRITERIA_EPS, 5, 1))
cv.imshow("dst",dst)
cv.waitKey(0)
cv.destroyAllWindows()
效果如下图:
3,图像积分图算法
概述
积分图像是Crow在1984年首次提出,是为了在多尺度透视投影中提高渲染速度,是一种快速计算图像区域和与平方和的算法。其核心思想是对每个图像建立自己的积分图查找表,在图像积分处理计算阶段根据预先建立的积分图查找表,直接查找从而实现对均值卷积线性时间计算,做到了卷积执行的时间与半径窗口大小的无关联。图像积分图在图像特征提取HAAR/SURF、二值图像分析、图像相似相关性NCC计算、图像卷积快速计算等方面均有应用,是图像处理中的经典算法之一。
图像积分图建立与查找
在积分图像(Integral Image - ii)上任意位置(x, y)处的ii(x, y)表示该点左上角所有像素之和, 其中(x,y)是图像像素点坐标。
示例代码如下:
import cv2 as cv
import numpy as np
#图像积分表算法
def get_block_sum(ii, x1, y1, x2, y2, index):
tl = ii[y1, x1][index]
tr = ii[y2, x1][index]
bl = ii[y1, x2][index]
br = ii[y2, x2][index]
s = (br - bl - tr + tl)
return s
def blur_demo(image, ii):
h, w, dims = image.shape
result = np.zeros(image.shape, image.dtype)
ksize = 15
radius = ksize // 2
for row in range(0, h + radius, 1):
y2 = h if (row + 1)> h else (row + 1)
y1 = 0 if (row - ksize) < 0 else (row - ksize)
for col in range(0, w + radius, 1):
x2 = w if (col + 1)>w else (col + 1)
x1 = 0 if (col - ksize) < 0 else (col - ksize)
cx = 0 if (col - radius) < 0 else (col - radius)
cy = 0 if (row - radius) < 0 else (row - radius)
num = (x2 - x1) * (y2 - y1)
for i in range(0, 3, 1):
s = get_block_sum(ii, x1, y1, x2, y2, i)
result[cy, cx][i] = s // num
cv.imshow("integral fast blur", result)
src = cv.imread("ma.jpg")
cv.imshow("input", src)
sum_table = cv.integral(src, sdepth=cv.CV_32S)
blur_demo(src, sum_table)
cv.waitKey(0)
cv.destroyAllWindows()
效果如下:
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)