欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-01-03 23:48:04
基础版笔记传送门:python3+opencv学习笔记汇总目录(适合基础入门学习)图像金字塔变小变大原理见基础版链接,基础版图像金字塔讲解:opencv学习笔记19:图像金字塔和图像拉普拉斯金字塔 (用于图像放大和缩小)向下取样实现,变小dst=cv2.pyrDown(src)dst:取样结果src:原始图像import cv2 as cvimport numpy as npdef pyramid_demo(image): level = 3 temp =...

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

图像金字塔

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

原理见基础版链接,
基础版图像金字塔讲解:
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()
opencv进阶学习笔记10:图像金字塔和图像梯度

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

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

opencv进阶学习笔记10:图像金字塔和图像梯度
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()
opencv进阶学习笔记10:图像金字塔和图像梯度

注意图像尺寸必须是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,可以发现边缘处导数最高。
一阶导数就是做差的意思。
opencv进阶学习笔记10:图像金字塔和图像梯度
opencv进阶学习笔记10:图像金字塔和图像梯度
算子和为0

laplacian算子理论
opencv进阶学习笔记10:图像金字塔和图像梯度
opencv进阶学习笔记10:图像金字塔和图像梯度
算子和为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()
opencv进阶学习笔记10:图像金字塔和图像梯度

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()
opencv进阶学习笔记10:图像金字塔和图像梯度

说明代码

#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

上一篇:

下一篇: