OpenCV(python)一键入门--第八篇(边缘保留滤波算法 和 图像积分图)

举报
拓佑豪 发表于 2021/07/23 16:27:32 2021/07/23
【摘要】 边缘保留滤波算法 和 图像积分图

前面介绍的卷积模糊,有一个问题就是,模糊过后的图像,其边缘信息受到破坏。所以有了今天的边缘保留滤波算法:


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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。