当前位置: 移动技术网 > IT编程>脚本编程>Python > opencv进阶学习笔记10:图像金字塔和图像梯度

opencv进阶学习笔记10:图像金字塔和图像梯度

2020年07月16日  | 移动技术网IT编程  | 我要评论

基础版笔记传送门:
python3+opencv学习笔记汇总目录(适合基础入门学习)

图像金字塔

变小

变大

原理见基础版链接,
基础版图像金字塔讲解:
opencv学习笔记19:图像金字塔和图像拉普拉斯金字塔 (用于图像放大和缩小)
向下取样实现,变小

dst=cv2.pyrDown(src)

dst:取样结果
src:原始图像

import cv2 as cv
import numpy as np

def pyramid_demo(image):
    level = 3
    temp = image.copy()
    pyramid_images = []
    for i in range(level):
        dst = cv.pyrDown(temp)
        pyramid_images.append(dst)
        cv.imshow("pyramid_down_"+str(i), dst)
        temp = dst.copy()
    return pyramid_images
print("--------- Python OpenCV Tutorial ---------")
src = cv.imread("duoren.jpg")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
c=pyramid_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()

拉普拉斯金字塔图像金字塔

结果=原始图像-先向下再向上
向下:尺寸变小
向上:尺寸变大

import cv2 as cv
import numpy as np

def pyramid_demo(image):
    level = 3
    temp = image.copy()
    pyramid_images = []
    for i in range(level):
        dst = cv.pyrDown(temp)
        pyramid_images.append(dst)
        #cv.imshow("pyramid_down_"+str(i), dst)
        temp = dst.copy()
    return pyramid_images
def lapalian_demo(image):
    pyramid_images = pyramid_demo(image)#首先得到高斯金字塔结果
    level = len(pyramid_images)
    for i in range(level-1, -1, -1):#从小图到大图
        if (i-1) < 0 :#最后一层特殊处理
            expand = cv.pyrUp(pyramid_images[i], dstsize=image.shape[:2])
            lpls = cv.subtract(image, expand)
            cv.imshow("lapalian_down_" + str(i), lpls)
        else:
            expand = cv.pyrUp(pyramid_images[i], dstsize=pyramid_images[i-1].shape[:2])
            lpls = cv.subtract(pyramid_images[i-1], expand)
            cv.imshow("lapalian_down_"+str(i), lpls)

print("--------- Python OpenCV Tutorial ---------")
src = cv.imread("lena.png")#图必须要是2的N次倍数
#src=cv.resize(src,(512,512))
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
lapalian_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()

注意图像尺寸必须是2的倍数,否则报错
错误信息如下

cv2.error: OpenCV(4.2.0) C:\projects\opencv-python\opencv\modules\imgproc\src\pyramids.cpp:923: error: (-215:Assertion failed) std::abs(dsize.width - ssize.width*2) == dsize.width % 2 && std::abs(dsize.height - ssize.height*2) == dsize.height % 2 in function 'cv::pyrUp_'

图像梯度

基础讲解
opencv学习笔记15: 梯度运算之sobel算子及其函数使用

opencv学习笔记16:梯度运算之scharr算子及其函数使用
opencv学习笔记17:梯度运算之laplacian算子及其应用

sobel算子理论
如图,图中红色点区域,从头发到皮肤。开先处于头发区域,头发是黑色,像素点,然后处于皮肤,像素相对较高,得到下列图2,对图2求取一阶导师得到图3,可以发现边缘处导数最高。
一阶导数就是做差的意思。


算子和为0

laplacian算子理论


算子和为0

sobel算子实现

import cv2 as cv
import numpy as np

def sobel_demo(image):
    grad_x = cv.Scharr(image, cv.CV_32F, 1, 0)
    grad_y = cv.Scharr(image, cv.CV_32F, 0, 1)
    gradx = cv.convertScaleAbs(grad_x)#取绝对值,并转到8位二进制格式
    grady = cv.convertScaleAbs(grad_y)
    cv.imshow("gradient-x", gradx)
    cv.imshow("gradient-y", grady)

    gradxy = cv.addWeighted(gradx, 0.5, grady, 0.5, 0)
    cv.imshow("gradient", gradxy)

print("--------- Python OpenCV Tutorial ---------")
src = cv.imread("daqiu.jpg")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
sobel_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()

scharr算子是sobel算子的增强版本。无须再讲,当sobel得到的边缘不是很好时,考虑scharr算子。

laplacian算子实现

import cv2 as cv
import numpy as np

def lapalian_demo(image):
    #dst = cv.Laplacian(image, cv.CV_32F)
    #lpls = cv.convertScaleAbs(dst)
    kernel = np.array([[1, 1, 1], [1, -8, 1], [1, 1, 1]])
    dst = cv.filter2D(image, cv.CV_32F, kernel=kernel)
    lpls = cv.convertScaleAbs(dst)
    cv.imshow("lapalian_demo", lpls)



print("--------- Python OpenCV Tutorial ---------")
src = cv.imread("daqiu.jpg")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
lapalian_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()

说明代码

#dst = cv.Laplacian(image, cv.CV_32F)
 #lpls = cv.convertScaleAbs(dst)

等于

kernel = np.array([[1, 1, 1], [1, -8, 1], [1, 1, 1]])
 dst = cv.filter2D(image, cv.CV_32F, kernel=kernel)
 lpls = cv.convertScaleAbs(dst)

电气专业的计算机萌新,写博文不容易。如果你觉得本文对你有用,请点个赞支持下,谢谢。

本文地址:https://blog.csdn.net/kobeyu652453/article/details/107353381

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网