数字图像处理学习笔记(二)

news2024/11/27 18:42:41

数字图像处理学习笔记(二)

  • gamma变换
  • 对数与对比度拉伸
  • 直方图绘制,直方图均衡化,直方图匹配
    • 绘制直方图
    • 直方图均衡化
    • 直方图匹配
  • 空间滤波
    • 线性滤波
    • 非线性滤波

gamma变换

  • 数学原理
    幂等变换: I = c I γ I=cI^\gamma I=cIγ
    在这里插入图片描述

  • MATLAB

    g=imadjust(f,[low_in high_in],[low_out high_out],gamma)    
    %[]默认[0 1];若low_out>high_out,亮度反转    
    %gamma>1,曲线上弯,变亮,从而进行对比度增强;gamma<1,曲线下弯,变暗,从而进行灰度级压缩。
    
  • python

    #自己编的函数复现MATLAB的imadjust函数,
    # img_mono单通道图像,[low_in,high_in]到[0,1]映射,out_inverse=1时为到[1,0]的映射
    def imadjust(img_mono, gamma, low_in=0, high_in=255, out_inverse=0):
      # img_mono单通道图像,[low_in,high_in]到[0,1]映射,out_inverse=1时为到[1,0]的映射
      # 将[low_in,high_in]以外值减掉,向量化
      image_trunc = (img_mono > high_in) * high_in + (img_mono <= high_in) * img_mono
      image_trunc = (image_trunc < low_in) * low_in + (image_trunc >= low_in) * image_trunc
      # 归一化0-1
      img_adjust = (image_trunc - image_trunc.min()) / float(image_trunc.max() - image_trunc.min())
      # 反转
      if out_inverse == 1:
            img_adjust = 1 - img_adjust
      # gamma变换
      img_adjust = (img_adjust**gamma)*255
      #!!此处有问题!!,img_adjust为浮点型0-255.0,imshow会显示不正常
      return img_adjust
    
    #skimage
    import cv2
    from skimage import exposure
    img = cv2.imread('1.jpg')
    gamma_img = exposure.adjust_gamma(img, gamma)
    #skimage像素值拉伸。若image为uint8类型,[min,max]映射到[0,255];若为float,映射到[0,1.0]
    exposure.rescale_intensity(image)
    

对数与对比度拉伸

  • 数学原理

    • 对数变换(压缩高动态范围): l o g ( 1 + f ) log(1+f) log(1+f) 1 0 6 10^6 106可被压缩到14
      在这里插入图片描述

    • 对比度拉伸变换: 1 ( 1 + ( m / I ) E ) \frac{1}{(1+(m/I)^E)} (1+(m/I)E)1,m为灰度控制点,E控制斜率
      在这里插入图片描述

  • MATLAB

    %压缩高动态范围
    in2uint8(mat2gray(log(1+double(f))))
    %对比度拉伸变换,eps防止分母为0导致溢出
    1./(1+(m./(double(f)+eps)).^E)
    #m=mean2(f),取平均值
    
  • python

    #log-skimage
    from skimage import ecposure
    gam1= exposure.adjust_log(image) 
    #adjust_log(image, gain=1, inv=False)
    #该函数在将每个像素缩放到0到1范围之后,根据方程O=gain∗log(1+I)变换输入图像像素,对于逆对数校正,该方程为O=gain∗(2^I−1)
    
    #对比度增强-PIL
    from PIL import Image
    from PIL import ImageEnhance
    #原始图像
    image = Image.open('lena.jpg')
    image.show()
    #亮度增强
    enh_bri = ImageEnhance.Brightness(image)
    brightness = 1.5
    image_brightened = enh_bri.enhance(brightness)
    #色度增强
    enh_col = ImageEnhance.Color(image)
    color = 1.5
    image_colored = enh_col.enhance(color) 
    #对比度增强
    enh_con = ImageEnhance.Contrast(image)
    contrast = 1.5
    image_contrasted = enh_con.enhance(contrast)
    #锐度增强
    enh_sha = ImageEnhance.Sharpness(image)
    sharpness = 3.0
    image_sharped = enh_sha.enhance(sharpness)
    

直方图绘制,直方图均衡化,直方图匹配

绘制直方图

  • MATLAB

    #介绍
    h = imhist(f, b) %b为灰度级个数,h(1),h(2)...代表各灰度级像素点个数
    h = imhist(f, b)/numel(f) %numel(f)代表f像素点个数
    bar(horz, v, width) #horz与v相同维度,width默认为0.8
    stem(horz, v, 'color_linestyle_marker', 'fill')
    

    在这里插入图片描述

    #绘制条形直方图案例
    h= imhist(f)
    h1= h(1:10:256) %10个灰度级为一组
    horz = 1:10:256
    bar(horz, h1)
    axis([0 255 0 15000])
    set(gca, 'xtick', 0:50:255)  #设置刻度
    set(gca, 'ytick', 0:2000:15000)  #设置刻度
    xlabel('text string', 'frontsize', size)
    ylabel('text string', 'frontsize', size)
    text(xloc,yloc,'textstring', 'frontsize', size) %xloc,yloc为文字起始位置
    title('titlestring')
    #绘制杆状直方图, 也可plot
    h= imhist(f)
    h1= h(1:10:256) %10个灰度级为一组
    horz = 1:10:256
    stem(horz, h1, 'fill')
    axis([0 255 0 15000])
    set(gca, 'xtick', 0:50:255)  #设置刻度
    set(gca, 'ytick', 0:2000:15000)  #设置刻度
    
    #将灰度数组映射为直方图字典,nums表示灰度的数量级
    def arrayToHist(grayArray, nums):
        w,h = grayArray.shape
        hist = {}
        for k in range(nums):
          hist[k] = 0
        for i in range(w):
          for j in range(h):
            if hist.get(grayArray[i][j]) is None:
                hist[grayArray[i][j]] = 0
            hist[grayArray[i][j]] += 1
        #normalize
        n = w*h
        for key in hist.keys():
            hist[key] = float(hist[key])/n
        return hist
    #绘制直方图,传入的直方图要求是个字典,每个灰度对应着概率
    def drawHist(hist,name):
        keys = hist.keys()
        values = hist.values()
        x_size = len(hist)-1#x轴长度,也就是灰度级别
        axis_params = []
        axis_params.append(0)
        axis_params.append(x_size)
        plt.figure()
        if name != None:
           plt.title(name)
        plt.bar(tuple(keys),tuple(values))#绘制直方图
        plt.show()
    

直方图均衡化

灰度级均衡化处理的最终结果是一幅扩展了动态范围的图像,有较高的对比度

  • 数学原理

    • 建立原图像到均衡化图像的灰度级(亮度值)映射,使均衡化图像灰度级概率密度函数PDF为常数
      s ϵ [ 0 , 1 ] s\epsilon[0,1] [0,1]为映射后的灰度级,r为原图像灰度级
      s = T ( r ) = ∫ 0 r p r ( w )   d w s=T(r)=\int_0^r p_r(w) \,{\rm d}w s=T(r)=0rpr(w)dw
    • 证明:映射后PDF为常数
      映射前后各灰度级像素个数不变,即 p s ( s ) = p r ( r ) ∣ d r d s ∣ p_s(s)=p_r(r)\mid\frac{{\rm d}r}{{\rm d}s}\mid ps(s)=pr(r)dsdr

    p s ( s ) = p r ( r ) ∣ d r d s ∣ = p r ( r ) ∣ d r d T ( r ) ∣ p_s(s)=p_r(r)\mid\frac{{\rm d}r}{{\rm d}s}\mid=p_r(r) \mid \frac{{\rm d}r}{{\rm d}T(r)}\mid ps(s)=pr(r)dsdr∣=pr(r)dT(r)dr
    = p r ( r ) ∣ d d T ( r ) ∫ 0 r p r ( w )   d w ∣ = 1 =p_r(r)|\frac{{\rm d}}{{\rm d}T(r)} \int_0^r p_r(w) \,{\rm d}w |=1 =pr(r)dT(r)d0rpr(w)dw=1

    • 对于离散值 p r ( r k ) = n k n p_r(r_k)=\frac{n_k}{n} pr(rk)=nnk
      s k = T ( r k ) = ∑ j = 0 k p r ( r j ) = ∑ j = 0 k n j n s_k=T(r_k)=\sum_{j=0}^k p_r(r_j)=\sum_{j=0}^k \frac{n_j}{n} sk=T(rk)=j=0kpr(rj)=j=0knnj
      k = 0 , 1 , 2 , . . . , L − 1 k=0,1,2,...,L-1 k=0,1,2,...,L1
  • MATLAB

        g=histeq(f, nlev) %nlev为输出图像的灰度级数
    
        %绘制映射函数
        hnorm= imhist(f)./numel(f)
        cdf= cumsum(hnrom)
        x= linespace(0,1,256)
        plot(x, cdf)
    
  • python

    #计算累计直方图计算出新的均衡化的图片,h_s为计算好的直方图灰度级数组,nums为灰度数,256
    def equalization(grayArray, h_s,nums):
        #计算累计直方图
        tmp = 0.0
        h_acc = h_s.copy()
        for i in range(256):
           tmp += h_s[i]
           h_acc[i] = tmp
        if len(grayArray.shape) != 2:
           print("length error")
           return None
        w,h = grayArray.shape
        des = np.zeros((w,h),dtype = np.uint8)
        for i in range(w):
           for j in range(h):
               des[i][j] = int((nums - 1)* h_acc[grayArray[i][j] ] +0.5)
        return des
    

直方图匹配

当累计变换函数非常陡,即灰度级过于集中,直方图均衡化将失效;直方图匹配的结果则是我们指定的直方图,由于原始图像的累计直方图和我们指定的输出图片的直方图的累计直方图不可能完全相同,所以匹配结果并非百分之百的匹配。

  • 数学原理
    使两个累积概率函数尽可能相似
  • MATLAB
    g= histeq(f, hspec)  %hspec为指定的直方图;当hspec灰度级数远小于f中时,能较好的匹配
    %双峰值高斯函数模拟直方图,A为双峰权值;k用于提高直方图下限
    function p= two_mode_gauss(m1, sig1, m2, sig2, A1, A2, k)
    c1= A1 * (1/((2*pi)^0.5)*sig1)
    k1= 2* sig1^2
    c2= A2 * (1/((2*pi)^0.5)*sig2)
    k2= 2* sig2^2
    z= linspace(0,256,256)
    p= k+ c1*exp(-((z-m1).^2)./k1) + c2*exp(-((z-m2).^2)./k2)
    p= p./sum(p(:))
    
  • python
    #直方图匹配函数,接受原始图像grayArray和目标灰度直方图h_d
    def histMatch(grayArray,h_d):
        #计算累计直方图
        tmp = 0.0
        h_acc = h_d.copy()
        for i in range(256):
            tmp += h_d[i]
            h_acc[i] = tmp
        h1 = arrayToHist(grayArray,256)
        tmp = 0.0
        h1_acc = h1.copy()
        for i in range(256):
            tmp += h1[i]
            h1_acc[i] = tmp
        #计算映射
        M = np.zeros(256)
        for i in range(256):
            idx = 0
            minv = 1
            for j in h_acc:
                if  np.fabs(h_acc[j] - h1_acc[i]) < minv:
                   minv = np.fabs(h_acc[j] - h1_acc[i])
                   idx = int(j)
            M[i] = idx
        des = M[grayArray]
        return des
    

空间滤波

线性滤波

Q:相关与卷积??有什么案例能说明,二者对试验结果的影响?

  • MATLAB

    • 生成滤波器
      w = fspecial('type', parameters)
      在这里插入图片描述
      在这里插入图片描述

    • 滤波,w为掩膜,w=[1 1 1; 1 -8 1; 1 1 1]
      g=imfilter(f, w, filtering_mode, boundary_option, size_option)
      在这里插入图片描述

  • python

    #用到再去找
    #blur—图像均值平滑滤波src:图像矩阵;ksize:滤波窗口尺寸
    cv2.blur(src, ksize, dst=None, anchor=None, borderType=None)
    #GaussianBlur—图像高斯平滑滤波;src:图像矩阵;ksize:滤波窗口尺寸;sigmaX:标准差
    cv2.GaussianBlur(src, ksize, sigmaX, dst=None, sigmaY=None, borderType=None)
    #laplace
    kernel = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]], np.float32)
    dst = cv2.filter2D(img, -1, kernel=kernel)
    #Sobel函数
    cv2.Sobel(src, ddepth, dx, dy, dst=None, ksize=None, scale=None, delta=None, borderType=None)
    #前四个是必须的参数:src是需要处理的图像;ddepth是图像的深度,-1表示采用的是与原图像相同的深度。目标图像的深度必须大于等于原图像的深度;第三和第四:dx和dy表示的是求导的阶数,0表示这个方向上没有求导,一般为0、1、2。
    

非线性滤波

  • MATLAB
    • 最佳选择colfilt
      colfilt占用更多内存,但比nlfilter快得多。

    • 填充函数padarray

    • ordfilt2生成统计排序滤波器

  • python
    #medianBlur—图像中值滤波;src:图像矩阵;ksize:滤波窗口尺寸
    cv2.medianBlur(src, ksize, dst=None)
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1530460.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JWT原理分析

为什么会有JWT的出现&#xff1f; 首先不得不提到一个知识叫做跨域身份验证&#xff0c;JWT的出现就是为了更好的解决这个问题&#xff0c;但是在没有JWT的时候&#xff0c;我们一般怎么做呢&#xff1f;一般使用Cookie和Session&#xff0c;流程大体如下所示&#xff1a; 用…

关于 Microsoft Visual Studio

关于 Microsoft Visual Studio References References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

Visual Studio 2013 - 清理

Visual Studio 2013 - 清理 1. 清理1.1. 工程清理1.2. 解决方案清理 References 1. 清理 Debug Release 1.1. 工程清理 (right mouse click on the project) -> 清理 1.2. 解决方案清理 (right mouse click on the solution) -> 清理解决方案 References [1] Yongq…

快速搭建一个一元二次方程flask应用

新建flask_service目录、templates子目录 flask_service —— app.py —— templates —— —— index.html app.py from flask import Flask, request, jsonify, render_template import random import matplotlib.pyplot as plt from io import BytesIO import base64app F…

Java项目基于SpringBoot和Vue的时装购物系统的设计与实现

今天要和大家聊的是一款基于SpringBoot和Vue的时装购物系统。 &#x1f495;&#x1f495;作者&#xff1a;李同学 &#x1f495;&#x1f495;个人简介&#xff1a;混迹在java圈十年有余&#xff0c;擅长Java、微信小程序、Python、Android等&#xff0c;大家有这一块的问题可…

综合练习(python)

前言 有了前面的知识积累&#xff0c;我们这里做两个小练习&#xff0c;都要灵活运用前面的知识。 First 需求 根据美国/英国各自YouTube的数据&#xff0c;绘制出各自的评论数量的直方图 第一版 import numpy as np from matplotlib import pyplot as plt import matplo…

Android TransactionTooLargeException排查定位

Android TransactionTooLargeException排查定位 工具&#xff1a; https://github.com/guardian/toolargetoolhttps://github.com/guardian/toolargetool android TransactionTooLargeException问题的修复&#xff0c;一种简单的修复就是在Fragment的onCreate里面&#xff0…

【Ubuntu】常用命令

一般操作 pwd&#xff08;present working directory&#xff09; 显示当前的工作目录/路径。 cd (change directory) 改变目录&#xff0c;用于输入需要前往的路径/目录。 有一些特殊命令也很常用 : 解释 前往同一级的另一个目录 cd ../directory name cd .. 表示进入上…

(一)基于IDEA的JAVA基础2

通过记事本练习我们可以大致了解java的运行过程 使用工具开发: 常用工具:Eclipse, MyEclipse,IDEA 这里我们用的开发工具是IDEA&#xff0c;其下载和破解方式在我们这个平台上一搜就有&#xff0c;这个我就不多言了&#xff0c;其他老师都比我有权威性&#xff0c;因为我当初…

软考 系统架构设计师系列知识点之系统性能(1)

所属章节&#xff1a; 第2章. 计算机系统基础知识 第9节. 系统性能 系统性能是一个系统提供给用户的所有性能指标的集合。它既包括硬件性能&#xff08;如处理器主频、存储器容量、通信带宽等&#xff09;和软件性能&#xff08;如上下文切换、延迟、执行时间等&#xff09;&a…

Covalent Network借助大规模的历史Web3数据集,推动人工智能发展

人工智能在众多领域中增强了区块链的实用性&#xff0c;反之亦然&#xff0c;区块链确保了 AI 模型所使用的数据的来源和质量。人工智能带来的生产力提升&#xff0c;将与区块链系统固有的安全性和透明度融合。 Covalent Network&#xff08;CQT&#xff09;正位于这两项互补技…

Linux环境变量【终】

&#x1f30e;环境变量 文章目录&#xff1a; 环境变量 环境变量的组织方式 创建自己的环境变量       main函数参数       C语言提供的变量与接口 环境变量与本地变量 了解本地变量       取消本地变量和环境变量 环境变量的出处 总结 前言&#xff1a; 上…

【RK3399 -PCIE移植过程记录】

一、&#xff0c;pcie开发可通过参考官方开发文档&#xff1a; 具体的硬件外设都有官网的参考文档&#xff0c;pcie的具体可参考&#xff1a; https://github.com/mfkiwl/rk-open-docs/blob/master/PCIe/Rockchip_RK3399_Developer_Guide_PCIe_CN.md 二、具体设备树文件 vi …

时序预测 | Matlab基于BiTCN-LSTM双向时间卷积长短期记忆神经网络时间序列预测

时序预测 | Matlab基于BiTCN-LSTM双向时间卷积长短期记忆神经网络时间序列预测 目录 时序预测 | Matlab基于BiTCN-LSTM双向时间卷积长短期记忆神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab基于BiTCN-LSTM双向时间卷积长短期记忆神经网络时…

数据在内存中的存储(C语言)(难点,需多刷几遍)

目录 整数在内存中的存储 大小端字节序和字节序判断 什么是大小端&#xff1f; 为什么有大小端&#xff1f; 练习1 练习2 练习3 练习4 练习5 练习6&#xff08;较难、重点&#xff09; 代码解读&#xff1a; 浮点数在内存中的存储 练习 浮点数的存储 浮点数存的…

Redis之缓存穿透、缓存雪崩、缓存击穿

Redis之缓存穿透、缓存雪崩、缓存击穿 什么是缓存穿透&#xff1f; 如果有人故意将请求打到未缓存的数据上&#xff0c;会对数据库造成巨大的压力 如何解决&#xff1f; 做好参数校验&#xff0c;比如请求的id不能<0&#xff0c;在访问数据库前就把这些异常访问拦截了 缓…

nginx搭建及部署

目录 一、nginx是什么&#xff1f; 二、安装部署 1.下载 2.配置 3.代理Swagger服务 4.nginx命令 一、nginx是什么&#xff1f; 是用于 Web 服务、反向代理、内容缓存、负载均衡、媒体流传输等场景的开源软件。它最初是一款专为实现最高性能和稳定性而设计的 Web 服务器。…

使用 CSS 实现毛玻璃效果

在现代 Web 设计中,毛玻璃效果越来越受欢迎。它能够让界面元素看起来更加柔和、朦胧,同时又不会完全遮挡背景内容,给人一种透明而又不失质感的视觉体验。虽然过去实现这种效果需要借助图像编辑软件,但现在只需要几行 CSS 代码,就可以在网页上呈现出令人惊艳的毛玻璃效果。 使用…

Data-Free Generalized Zero-Shot Learning 中文版

摘要 深度学习模型具有从大规模数据集中提取丰富知识的能力。然而&#xff0c;由于涉及到数据版权和隐私问题&#xff0c;数据共享变得越来越具有挑战性。因此&#xff0c;这妨碍了从现有数据向新的下游任务和概念有效转移知识。零样本学习&#xff08;ZSL&#xff09;方法旨在…