图像的基本运算(Python)

  • 概述

图像处理运算可以分为点运算、代数运算、逻辑运算和几何运算

  • 点运算 

直接对每个像素点的灰度值按照一定关系进行运算,有规律改变像素点的灰度值,可用于提升图像的对比度,起放大图像细节的效果。

  1. 线性点运算

    函数形式:t = as + b

    s代表输入图像像素值,a运算系数,b为常数

    (1) 如果a=1b=0,则t=s,即输入图像与输出图像相同。如果a=1b≠0,则输出图像的灰度值上移或下移,整个图像在显示会更亮或更暗。

    2)如果a>1,则输出图像对比度增大,输出图像显示效果较输入图像会更亮。(图像的灰度值变大,图像更亮)

    3)如果a<1,则输出图像对比度降低,输出图像显示效果较输入图像会更暗。

    4)如果a<0,即a为负值,则原输入图像的暗区域将变亮,亮区域将变暗。

    参考代码:

    ​
    import cv2 as cv
    import matplotlib.pyplot as plt
    
    image = cv.imread(' --------')  # 读取输入图像
    image2 = image / 255  # 输入换成double类型
    # 如果输入图像是unit8,unit16或者是二值的logical类型,则函数im2double将其值归一化到0~1之间。
    a = 2.5
    b = -70
    J = a * image2 + b / 255  # 增加对比度
    c = 0.7
    d = -30
    K = c * image2 + d / 255  # 减小对比度
    e = 1
    f = 70
    L = e * image2 + f / 255  # 线性增加亮度
    g = -1
    h = 255
    P = g * image2 + h / 255  # 图像反色
    cv.imshow('原图像', image2)
    cv.imshow('增加对比度', J)
    cv.imshow('减小对比度', K)
    cv.imshow('线性平移增加亮度', L)
    cv.imshow('图像反色', P)
    cv.waitKey()
    
    ​

  2. 非线性点运算

    1.对数变换                                                                                                                                  函数形式:t = log(1+S)                                                                                                     c为尺度比例常数,s为输入图像灰度值,t为变换后的输出图像灰度值。                                 

    观察图像可知此变换对于灰度值小的点斜率很高,灰度值大的点斜率很低,可以应用与将图想暗区域变亮,扩展被压缩的较暗像素。(参考代码对应图片一起放指数变换下面了)

    2.指数变换    (伽马变换)                                                                                                           函数形式:t = CS^γ

    1)当γ <1时,效果和对数变换相似,放大暗处细节,压缩亮处细节,随着数值减少,效果越强。

    2)当γ >1时,放大亮处细节,压缩暗处细节,随着数值增大,效果越强。                  (3)当γ =1时,t = cs,这操作的得到的输出图像是线性的。   


                     指数变换参考代码:

    import cv2 as cv
    import numpy as np
    
    # 伽马变换增强对比度
    in_image = cv.imread('E:/image/firework.jpg', cv.IMREAD_GRAYSCALE)
    # 图像归一化(压缩BGR范围到0至1)
    fI = in_image / 255.0
    # 伽马变化
    gamma = 0.1
    out_image = np.power(fI, gamma)
    # 显示原图和伽马变化后的效果
    cv.imshow('IN', in_image)
    cv.imshow('OUT', out_image)
    cv.waitKey(0)
    cv.destroyAllWindows()

    由图像可知γ = 0.1和知数变换类似,但由于我选的γ值过小效果更加明显,可见原图像(右图)的更加暗区域清晰,当γ = 3反之。                      

    γ = 3
    γ = 3

                                 

    γ = 0.1
    γ = 0.1

        对数变换参考代码:由图像可以知道通过对数运算后,天空部分(暗部分)更加清晰,烟花(亮部分)被弱化了

    import cv2 as cv
    import copy
    import math
    
    # 以灰度图形式读入原始图像
    img = cv.imread('E:/image/firework.jpg', 0)
    # 对数变换
    log = copy.deepcopy(img)
    rows = img.shape[0]
    cols = img.shape[1]
    for i in range(rows):
        for j in range(cols):
            log[i][j] = 10 * math.log(1 + log[i][j])
    
    # 通过窗口展示图片 第一个参数为窗口名 第二个为读取的图片变量
    
    cv.imshow('log', log)
    # 变换后的图片生成新文件并保存
    cv.imwrite('E:/image/firework2.jpg', log)
    cv.waitKey(0)
    cv.destroyAllWindows()
    
    原图像
    原图像
    灰度图
    灰度图
    对数变换后
    标题对数变换后
  • 代数运算

        主要应用:消除或降低加性噪声(图像增强),图案,检测两副图像之间的变化,检测物体的运动等。


  • 加法运算                                                                                                                                    数学表达式S(x,y)=A(x,y)+B(x,y)

    实现两幅图像的叠加效果和平均值降噪 (同一图像多次相加求平均)                                    图像叠加参考代码:                                                                                                                      图像平均值降噪参考代码:

  • 减法运算


    乘法运算


    除法运算


  • 逻辑运算

  • 几何运算

  • 22
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Python中进行图像梯度运算可以使用OpenCV库中的函数morphologyEx(),其参数cv2.MORPH_GRADIENT对应梯度运算图像梯度计算的是图像变化的速度,在边缘部分,由于灰度值变化较大,梯度值也较大;而在图像中比较平滑的部分,灰度值变化较小,对应的梯度值也较小。通常,图像梯度计算主要用于检测图像的边缘信息。 在进行图像梯度运算时,可以使用Sobel算子和Laplacian算子。Sobel算子用于计算图像的水平和垂直方向的偏导数的近似值,然后将两个方向的偏导数叠加得到梯度值。自定义函数实现Sobel算子也是可行的。而Laplacian算子直接计算图像的二阶导数,可以用于检测图像的边缘和纹理信息。 以下是进行图像梯度运算的一般步骤和代码示例: 1. 导入OpenCV库和numpy库: ``` import cv2 import numpy as np ``` 2. 读取图像并将其转换为灰度图像: ``` image = cv2.imread("image.jpg") gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) ``` 3. 使用Sobel算子进行图像梯度计算: ``` sobelx = cv2.Sobel(gray, cv2.CV_64F, 1, 0, ksize=3) sobely = cv2.Sobel(gray, cv2.CV_64F, 0, 1, ksize=3) gradient = np.sqrt(sobelx**2 + sobely**2) ``` 4. 使用Laplacian算子进行图像梯度计算: ``` laplacian = cv2.Laplacian(gray, cv2.CV_64F) ``` 5. 显示图像和梯度结果: ``` cv2.imshow("Original Image", image) cv2.imshow("Gradient", gradient.astype(np.uint8)) cv2.imshow("Laplacian", laplacian.astype(np.uint8)) cv2.waitKey(0) cv2.destroyAllWindows() ``` 这样就可以进行图像梯度运算,并观察图像的边缘和纹理信息。根据具体的需求,可以选择使用Sobel算子或Laplacian算子来计算图像的梯度。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [数字图像处理作业python代码.zip](https://download.csdn.net/download/weixin_55305220/88283085)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Python图像处理(九)——形态学运算图像运算、比运算、梯度运算](https://blog.csdn.net/AI_girl/article/details/114838698)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [图像处理之图像梯度(python实现)](https://blog.csdn.net/m0_53192838/article/details/127415508)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值