OpenCV(python)一键入门--十一篇(图像锐化,边缘检测与图像金字塔)

举报
拓佑豪 发表于 2021/07/26 15:08:44 2021/07/26
【摘要】 简单介绍图像锐化,边缘检测以及图像金字塔

1:USM锐化增强方法(Unsharpen Mask)

import cv2 as cv
import numpy as np
#USM锐化增强方法(Unsharpen Mask)
#先对原图高斯模糊,用原图减去系数x高斯模糊的图像
#再把值Scale到0~255的RGB像素范围
#优点:可以去除一些细小细节的干扰和噪声,比卷积更真实
#(原图像-w*高斯模糊)/(1-w);w表示权重(0.1~0.9),默认0.6
src = cv.imread("ma.jpg")
cv.imshow("input", src)

# sigma = 5、15、25
blur_img = cv.GaussianBlur(src, (0, 0), 5)
usm = cv.addWeighted(src, 1.5, blur_img, -0.5, 0)
#cv.addWeighted(图1,权重1, 图2, 权重2, gamma修正系数, dst可选参数, dtype可选参数)
cv.imshow("mask image", usm)

h, w = src.shape[:2]
result = np.zeros([h, w*2, 3], dtype=src.dtype)
result[0:h,0:w,:] = src
result[0:h,w:2*w,:] = usm
cv.putText(result, "original image", (10, 30), cv.FONT_ITALIC, 1.0, (0, 0, 255), 2)
cv.putText(result, "sharpen image", (w+10, 30), cv.FONT_ITALIC, 1.0, (0, 0, 255), 2)
#cv.putText(图像名,标题,(x坐标,y坐标),字体,字的大小,颜色,字的粗细)
cv.imshow("sharpen_image", result)

cv.waitKey(0)
cv.destroyAllWindows()

函数原型:

cv.addWeighted(src1, alpha, src2, beta, gamma, dst=None, dtype=None)

cv.addWeighted(图1,权重1, 图2, 权重2, gamma修正系数, dst可选参数, dtype可选参数)

参数说明:

src1, src2:需要融合相加的大小和通道数相等的图像
alpha:src1的权重
beta:src2的权重
gamma:gamma修正系数,不需要修正设置为0。
dst:可选参数,输出结果保存的变量,默认值为None,如果为非None,输出图像保存到dst对应实参中,其大小和通道数与输入图像相同,图像的深度(即图像像素的位数)由dtype参数或输入图像确认
dtype:可选参数,输出图像数组的深度,即图像单个像素值的位数(如RGB用三个字节表示,则为24位),选默认值None表示与源图像保持一致。

效果如下:

2:Canny边缘检测器

import cv2 as cv
import numpy as np
#Canny边缘检测器,有效的噪声抑制,更强的完整边缘提取
#五个步骤 
#1:高斯模糊,降噪  
#2:梯度提取得到边缘候选
#3:角度计算与非最大信号抑制 
#4:高低阈值链接,获取完整边缘
#5:输出边缘
src = cv.imread("ma.jpg")
cv.imshow("input", src)

# t1 = 100, t2 = 3*t1 = 300
edge = cv.Canny(src, 100, 300)
cv.imshow("mask image", edge)
edge_src = cv.bitwise_and(src, src, mask=edge)
#这里的mask是指掩膜

h, w = src.shape[:2]
result = np.zeros([h, w*2, 3], dtype=src.dtype)
result[0:h,0:w,:] = src
result[0:h,w:2*w,:] = edge_src
cv.putText(result, "original image", (10, 30), cv.FONT_ITALIC, 1.0, (0, 0, 255), 2)
cv.putText(result, "edge image", (w+10, 30), cv.FONT_ITALIC, 1.0, (0, 0, 255), 2)
cv.imshow("edge detector", result)

cv.waitKey(0)
cv.destroyAllWindows()

函数原型:

cv.Canny(图像,阈值1,阈值2,可选【Sobel算子大小】)

效果如图所示:

补充:图像掩膜

在有些图像处理的函数中有的参数里面会有mask参数,即此函数支持掩膜操作,首先何为掩膜以及有什么用,如下:

数字图像处理中的掩膜的概念是借鉴于PCB制版的过程,在半导体制造中,许多芯片工艺步骤采用光刻技术,用于这些步骤的图形“底片”称为掩膜(也称作“掩模”),作用:在硅片上选定的区域中对一个不透明的图形模板遮盖,继而下面的腐蚀或扩散将只影响选定的区域以外的区域。
图像掩膜与其类似,用选定的图像、图形或物体,对处理的图像(全部或局部)进行遮挡,来控制图像处理的区域或处理过程。 
数字图像处理中,掩模为二维矩阵数组,有时也用多值图像,图像掩模主要用于:
①提取感兴趣区,用预先制作的感兴趣区掩模与待处理图像相乘,得到感兴趣区图像,感兴趣区内图像值保持不变,而区外图像值都为0。 
②屏蔽作用,用掩模对图像上某些区域作屏蔽,使其不参加处理或不参加处理参数的计算,或仅对屏蔽区作处理或统计。 
③结构特征提取,用相似性变量或图像匹配方法检测和提取图像中与掩模相似的结构特征。 
④特殊形状图像的制作。

3:图像金字塔

图像金字塔是图像多尺度表达的一种,是一种以多分辨率来解释图像的有效但概念简单的结构。一幅图像的图像金字塔是一系列以金字塔形状(自下而上)逐步降低,且来源于同一张原始图的图像分辨率集合。其通过梯次向下采样获得,直到达到某个终止条件才停止采样。我们将一层一层的图像比喻成金字塔,层级越高,则图像越小,分辨率越低。

代码如下

import cv2 as cv
#图像金字塔--对图像高斯模糊并下采样为原图的1/4
#redude(pyrDown):从原图生成高斯金字塔图像、生成一系列低分辨率图像
#expand(pyrUp):高斯金字塔反向生成高分辨率的图像
#rudude或expand必须逐层;每次都为前一次的1/4
def pyramid_down(pyramid_images):
    level = len(pyramid_images)
    for i in range(level-1, -1, -1):
        expand = cv.pyrUp(pyramid_images[i])
        cv.imshow("down "+str(i), expand)

def pyramid_up(image, level):
    temp = image.copy()
    pyramid_images = []
    for i in range(level):
        dst = cv.pyrDown(temp)
        pyramid_images.append(dst)
        cv.imshow("up " + str(i), dst)
        temp = dst.copy()
    return pyramid_images

src = cv.imread("ma.jpg")
cv.imshow("input", src)
pyramid_down(pyramid_up(src,3))

cv.waitKey(0)
cv.destroyAllWindows()

由于展示效果较差,建议手动调试测试,查看效果

4:拉普拉斯金字塔

拉普拉斯金字塔:Ln = G(n)-expand(G(n+1))
原图金字塔生成G0,G1,G2
G(0)-expand(G(1))得到两次高斯模糊输出的不同,L0称为DOG(高斯不同)
DOG ≈ LOG,所以用拉普拉斯金字塔

首先要进行金字塔的reduce操作,然后在通过expand操作,最后相减得到拉普拉斯金字塔图像。

在这里插入图片描述

高斯不同:高斯不同的意思就是对于同一张图像,采用不同的参数时,得到不同的灰度图进行相减,结果图像就是高斯不同。主要应用于灰度图的增强,以及角点检测。
步骤:
1、进行灰度转换
2、高斯模糊g1
3、高斯模糊g2
4 、相减:g1-g2
5、归一化:最大最小值归一化

import cv2 as cv
import numpy as np

def laplaian_demo(pyramid_images):
    level = len(pyramid_images)
    for i in range(level-1, -1, -1):
        if (i-1) < 0:
            h, w = src.shape[:2]
            expand = cv.pyrUp(pyramid_images[i], dstsize = (w, h))
            lpls = cv.subtract(src, expand) + 127
            cv.imshow("lpls " + str(i), lpls)
        else:
            h, w = pyramid_images[i-1].shape[:2]
            expand = cv.pyrUp(pyramid_images[i], dstsize = (w, h))
            lpls = cv.subtract(pyramid_images[i-1], expand) + 127
            cv.imshow("lpls " + str(i), lpls)


def pyramid_up(image, level):
    temp = image.copy()
    pyramid_images = []
    for i in range(level):
        dst = cv.pyrDown(temp)
        pyramid_images.append(dst)
        temp = dst.copy()
    return pyramid_images


src = cv.imread("ma.jpg")
cv.imshow("input", src)
laplaian_demo(pyramid_up(src,3))

cv.waitKey(0)
cv.destroyAllWindows()

同样的,展示效果不佳,感兴趣的小伙伴可以手动尝试

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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

举报
请填写举报理由
0/200