如何运用Python实现数字图像处理的长尾词技巧?

2026-04-19 22:021阅读0评论SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计2916个文字,预计阅读时间需要12分钟。

如何运用Python实现数字图像处理的长尾词技巧?

目录+基本概念+图像增强+整体代码+线性变换+分段线性变换+对数变换+指数变换+直方图+图像滤波+平滑图像+锐化图像+总结+基本概念+数字图像定义+针对一幅图像,我们可以将其放入坐标系中

目录
  • 基本概念
  • 图像增强
    • 整体代码
    • 线性变换
    • 分段线性变换
    • 对数变换
    • 幂律变换
    • 直方图
  • 图像滤波
    • 平滑图像
    • 锐化图像
  • 总结

    基本概念

    • 数字图像定义

    对于一幅图像,我们可以将其放入坐标系中,这里取图像左上定点为坐标原点,x 轴向右,和笛卡尔坐标系x轴相同;y 轴向下,和笛卡尔坐标系y轴相反。

    这样我们可将一幅图像定义为一个二维函数 f(x,y),图像中的每个像素就可以用 (x,y) 坐标表示,而在任何一对空间坐标 (x,y) 处的幅值 f 称为图像在该点的强度或灰度,当 x,y 和灰度值 f 是有限离散数值时,便称该图像为 数字图像

    :f的取值为区间[Lmin,Lmax],也将其称为图像的灰度级,实际情况下常常令该区间为[0,L-1],其中f=0时为黑色,f=1时在灰度级中为白色,所有中间值是从黑色到白色之间变化的灰度色调,而图像最高和最低灰度级之间的灰度差便为对比度

    :图像亮度、对比度、饱和度和锐化之间并不是彼此独立的,改变其中一个特征可能会同时引起图像其他特征的变化,至于变化的程度取决于图像本身的特性。

    • 亮度

    图像亮度通俗理解便是图像的明暗程度,如果灰度值在[0,255]之间,则 f 值越接近0亮度越低,f 值越接近255亮度越高。

    • 对比度

    指的是图像暗和亮的落差值,即图像最大灰度级和最小灰度级之间的差值

    • 饱和度

    饱和度指的是图像颜色种类的多少, 上面提到图像的灰度级是[Lmin,Lmax],则在Lmin、Lmax 的中间值越多,便代表图像的颜色种类多,饱和度也就更高,外观上看起来图像会更鲜艳,调整饱和度可以修正过度曝光或者未充分曝光的图片。使图像看上去更加自然

    • 锐化

    图像锐化是补偿图像的轮廓,增强图像的边缘及灰度跳变的部分,使图像变得清晰。图像锐化在实际图像处理中经常用到,因为在做图像平滑,图像滤波处理的时候经过会把丢失图像的边缘信息,通过图像锐化便能够增强突出图像的边缘、轮廓

    • 分辨率

    就是每英寸图像内有多少个像素点

    图像增强

    概述:主要分为空间域增强和频率域增强,本文主要介绍空间域增强方法:也就是直接对图片像素进行处理。

    整体代码

    import math import cv2 import numpy as np import matplotlib.pyplot as plt plt.rcParams['font.sans-serif'] = ['FangSong'] # 设置字体以便正确显示汉字 plt.rcParams['axes.unicode_minus'] = False # 正确显示连字符 MEDTH_ID=8 # 计算图片清晰度 def getImageVar(img): img2gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 转化成灰度图 # 对图片用 3x3 拉普拉斯算子做卷积得到边缘 计算出方差,并最后返回。 # 函数求完导数后会有负值,还有会大于255的值。而原图像是uint8,即8位无符号数,所以建立的图像位数不够,会有截断。因此要使用64位有符号的数据类型,即 cv2.CV_64F。 # 再用var函数求方差 imageVar = cv2.Laplacian(img2gray, cv2.CV_64F).var() return imageVar # 转接器 def handle(idx, img): if idx == 1: return handle_specific(img, linear) # 线性变化 if idx == 2: return handle_specific(img, linear_up) # 分段线性变化 if idx == 3: return handle_specific(img, Logarithmic) # 对数变换 if idx == 4: return handle_specific(img, power) # 幂指变换 if idx == 5: return handle_specific(img, cv2.equalizeHist) # 直方图均衡化 if idx == 6: return handle_specific(img, auto_equalizeHist) # 自适应直方图均衡化 if idx == 7: return handle_specific(img, laplacian) # laplacian算子图像锐化 if idx == 8: return handle_specific(img, non_sharpening) # 非锐化掩蔽 # 处理函数 def handle_specific(img, func): img_list = [func(i) for i in cv2.split(img)] result = cv2.merge((img_list[0], img_list[1], img_list[2])) return result # 线性变化 def linear(img): a, b = 1.5, 0 for i in range(img.shape[0]): for j in range(img.shape[1]): if img[i][j] * a + b > 255: img[i][j] = 255 else: img[i][j] = img[i][j] * a + b return img # 分段线性变换-线性对比度拉伸,增强感兴趣区域 def linear_up(img): # 灰度值的最大最小值 r_min, r_max = 255, 0 for i in range(img.shape[0]): for j in range(img.shape[1]): if img[i, j] > r_max: r_max = img[i, j] if img[i, j] < r_min: r_min = img[i, j] r1, s1 = r_min, 0 r2, s2 = r_max, 255 k = (s2 - s1) / (r2 - r1) for i in range(img.shape[0]): for j in range(img.shape[1]): if r1 <= img[i, j] <= r2: img[i, j] = k * (img[i, j] - r1) return img # 对数变换 def Logarithmic(img): for i in range(img.shape[0]): for j in range(img.shape[1]): img[i][j] = math.log(1+img[i][j]) cv2.normalize(img, img, 0, 255, cv2.NORM_MINMAX) img = cv2.convertScaleAbs(img) return img # 对数变换 def power(img): for i in range(img.shape[0]): for j in range(img.shape[1]): img[i][j] = math.pow(img[i][j],1.2) cv2.normalize(img, img, 0, 255, cv2.NORM_MINMAX) img = cv2.convertScaleAbs(img) return img # 自适应的直方图均衡化-非线性的对比度拉伸,增强感兴趣区域 def auto_equalizeHist(img): clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8)) img = clahe.apply(img) return img def laplacian(img): kernel = np.array([[0, 1, 0], [1, -4, 1], [0, 1, 0]]) # laplacian卷积核的一个模板 lapkernel_img = cv2.filter2D(img, -1, kernel) # 做卷积 img = img - lapkernel_img return img def non_sharpening(img): blur_img = cv2.blur(img, (5, 5)) mask_img = img - blur_img img = img + mask_img return img img = cv2.imread(filename='img/CB.61.20211203152034_crop_0.jpg', flags=1) result = handle(MEDTH_ID, img) print('原图的清晰度:', getImageVar(img)) print('处理之后的清晰度', getImageVar(result)) fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(10, 8), dpi=100) axes[0].imshow(img) axes[0].set_title("原图") axes[1].imshow(result) axes[1].set_title("处理之后的图片") plt.show()

    线性变换

    • 用处

    线性变换主要可以对图像的对比度和亮度进行调整(但是比较暴力),线性变换公式如下: f ( x , y ) = f ( x , y ) ∗ a + b f(x,y)=f(x,y)*a+b f(x,y)=f(x,y)∗a+b,参数 a 影响图像的对比度,参数 b 影响图像的亮度,具体分为可分为以下几种情况:

    • a>1:增强图像的对比度,图像看起来更加清晰
    • a<1: 减小了图像的对比度, 图像看起来变暗,
    • b>0:增加图像的亮度,图像变亮,
    • b<0:减少图像的亮度,图像变暗
    • a=-1 and b=255:图像翻转

    a=1.5,b=0的结果:

    分段线性变换

    • 对比度拉伸

    将原图的灰度范围限制为自定义范围,增强感兴趣区域。如将原来的 [ l m i n , l m a x ] [l_{min},l_{max}] [lmin​,lmax​]拉到 [ 0 , 255 ] [0,255] [0,255]

    • 阈值处理

    得到二值图,按照门限将灰度值变为0或者255

    • 灰度级分层

    为了在数字图像中突出我们感兴趣的灰度级区域 [A,B],在实际情况下可以有两种处理方式。

    突出灰度范围在 [A,B] 的区域,将其他区域灰度级降低到一个更低的级别突出灰度范围在 [A,B] 的区域,其他区域保持原灰度级不变

    对比度拉伸结果:

    对数变换

    • 用处

    对数变换将图像的低灰度值部分扩展,将其高灰度值部分压缩,以达到强调图像低灰度部分的目的;同时可以很好的压缩像素值变化较大的图像的动态范围,目的是突出我们需要的细节。

    反对数变换则与对数函数不同的是,强调的是图像的高灰度部分。

    结果:

    幂律变换

    • 用处

    幂律变换主要用于图像的校正,对漂白的图片或者是过黑的图片进行修正,根据 φ 的大小,主要可分为一下两种情况:

    • φ > 1: 处理漂白的图片,进行灰度级压缩
    • φ < 1: 处理过黑的图片,对比度增强,使得细节看的更加清楚

    直方图

    • 用处

    对比度较低的图像适合使用直方图均衡化方法来增强图像细节

    直方图均衡化结果:

    自适应直方图均衡化结果:

    图像滤波

    平滑图像

    通过模糊图像达到图像降噪的目的,但同时存在一个问题就是会使得图像的边缘被淡化。

    锐化图像

    主要目的是突出灰度的过渡部分,即突出图像的边缘(锐化空间滤波)

    图像锐化滤波中图像平滑是一个积分的过程,图像锐化便是通过图像微分增强边缘和其他突变,削弱灰度变换缓慢的区域。

    • laplacian算子

    其强调的是图像中灰度的变换,忽视图像灰度变换缓慢的区域。

    因此我们通过laplacian算子得出的是图像更多的是边缘线,因此,我们可以将原图和拉普拉斯图像叠加在一起,可以复原背景特性并且保持拉普拉斯锐化处理的效果。

    如何运用Python实现数字图像处理的长尾词技巧?

    • 用处

    可以增强局部的图像对比度

    结果:

    • 非锐化掩蔽

    非锐化掩蔽的思路便是应原图像减去平滑的图像,这样便得到强调边缘的图像,然后再和原图像相加,便达到强调图像边缘的效果,具体步骤如下:

    • 模糊原图像
    • 从原图像减去模糊图像(产生的差值图像称为模板)
    • 将模板和原图像相加

    结果:

    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持自由互联。

    本文共计2916个文字,预计阅读时间需要12分钟。

    如何运用Python实现数字图像处理的长尾词技巧?

    目录+基本概念+图像增强+整体代码+线性变换+分段线性变换+对数变换+指数变换+直方图+图像滤波+平滑图像+锐化图像+总结+基本概念+数字图像定义+针对一幅图像,我们可以将其放入坐标系中

    目录
    • 基本概念
    • 图像增强
      • 整体代码
      • 线性变换
      • 分段线性变换
      • 对数变换
      • 幂律变换
      • 直方图
    • 图像滤波
      • 平滑图像
      • 锐化图像
    • 总结

      基本概念

      • 数字图像定义

      对于一幅图像,我们可以将其放入坐标系中,这里取图像左上定点为坐标原点,x 轴向右,和笛卡尔坐标系x轴相同;y 轴向下,和笛卡尔坐标系y轴相反。

      这样我们可将一幅图像定义为一个二维函数 f(x,y),图像中的每个像素就可以用 (x,y) 坐标表示,而在任何一对空间坐标 (x,y) 处的幅值 f 称为图像在该点的强度或灰度,当 x,y 和灰度值 f 是有限离散数值时,便称该图像为 数字图像

      :f的取值为区间[Lmin,Lmax],也将其称为图像的灰度级,实际情况下常常令该区间为[0,L-1],其中f=0时为黑色,f=1时在灰度级中为白色,所有中间值是从黑色到白色之间变化的灰度色调,而图像最高和最低灰度级之间的灰度差便为对比度

      :图像亮度、对比度、饱和度和锐化之间并不是彼此独立的,改变其中一个特征可能会同时引起图像其他特征的变化,至于变化的程度取决于图像本身的特性。

      • 亮度

      图像亮度通俗理解便是图像的明暗程度,如果灰度值在[0,255]之间,则 f 值越接近0亮度越低,f 值越接近255亮度越高。

      • 对比度

      指的是图像暗和亮的落差值,即图像最大灰度级和最小灰度级之间的差值

      • 饱和度

      饱和度指的是图像颜色种类的多少, 上面提到图像的灰度级是[Lmin,Lmax],则在Lmin、Lmax 的中间值越多,便代表图像的颜色种类多,饱和度也就更高,外观上看起来图像会更鲜艳,调整饱和度可以修正过度曝光或者未充分曝光的图片。使图像看上去更加自然

      • 锐化

      图像锐化是补偿图像的轮廓,增强图像的边缘及灰度跳变的部分,使图像变得清晰。图像锐化在实际图像处理中经常用到,因为在做图像平滑,图像滤波处理的时候经过会把丢失图像的边缘信息,通过图像锐化便能够增强突出图像的边缘、轮廓

      • 分辨率

      就是每英寸图像内有多少个像素点

      图像增强

      概述:主要分为空间域增强和频率域增强,本文主要介绍空间域增强方法:也就是直接对图片像素进行处理。

      整体代码

      import math import cv2 import numpy as np import matplotlib.pyplot as plt plt.rcParams['font.sans-serif'] = ['FangSong'] # 设置字体以便正确显示汉字 plt.rcParams['axes.unicode_minus'] = False # 正确显示连字符 MEDTH_ID=8 # 计算图片清晰度 def getImageVar(img): img2gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 转化成灰度图 # 对图片用 3x3 拉普拉斯算子做卷积得到边缘 计算出方差,并最后返回。 # 函数求完导数后会有负值,还有会大于255的值。而原图像是uint8,即8位无符号数,所以建立的图像位数不够,会有截断。因此要使用64位有符号的数据类型,即 cv2.CV_64F。 # 再用var函数求方差 imageVar = cv2.Laplacian(img2gray, cv2.CV_64F).var() return imageVar # 转接器 def handle(idx, img): if idx == 1: return handle_specific(img, linear) # 线性变化 if idx == 2: return handle_specific(img, linear_up) # 分段线性变化 if idx == 3: return handle_specific(img, Logarithmic) # 对数变换 if idx == 4: return handle_specific(img, power) # 幂指变换 if idx == 5: return handle_specific(img, cv2.equalizeHist) # 直方图均衡化 if idx == 6: return handle_specific(img, auto_equalizeHist) # 自适应直方图均衡化 if idx == 7: return handle_specific(img, laplacian) # laplacian算子图像锐化 if idx == 8: return handle_specific(img, non_sharpening) # 非锐化掩蔽 # 处理函数 def handle_specific(img, func): img_list = [func(i) for i in cv2.split(img)] result = cv2.merge((img_list[0], img_list[1], img_list[2])) return result # 线性变化 def linear(img): a, b = 1.5, 0 for i in range(img.shape[0]): for j in range(img.shape[1]): if img[i][j] * a + b > 255: img[i][j] = 255 else: img[i][j] = img[i][j] * a + b return img # 分段线性变换-线性对比度拉伸,增强感兴趣区域 def linear_up(img): # 灰度值的最大最小值 r_min, r_max = 255, 0 for i in range(img.shape[0]): for j in range(img.shape[1]): if img[i, j] > r_max: r_max = img[i, j] if img[i, j] < r_min: r_min = img[i, j] r1, s1 = r_min, 0 r2, s2 = r_max, 255 k = (s2 - s1) / (r2 - r1) for i in range(img.shape[0]): for j in range(img.shape[1]): if r1 <= img[i, j] <= r2: img[i, j] = k * (img[i, j] - r1) return img # 对数变换 def Logarithmic(img): for i in range(img.shape[0]): for j in range(img.shape[1]): img[i][j] = math.log(1+img[i][j]) cv2.normalize(img, img, 0, 255, cv2.NORM_MINMAX) img = cv2.convertScaleAbs(img) return img # 对数变换 def power(img): for i in range(img.shape[0]): for j in range(img.shape[1]): img[i][j] = math.pow(img[i][j],1.2) cv2.normalize(img, img, 0, 255, cv2.NORM_MINMAX) img = cv2.convertScaleAbs(img) return img # 自适应的直方图均衡化-非线性的对比度拉伸,增强感兴趣区域 def auto_equalizeHist(img): clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8)) img = clahe.apply(img) return img def laplacian(img): kernel = np.array([[0, 1, 0], [1, -4, 1], [0, 1, 0]]) # laplacian卷积核的一个模板 lapkernel_img = cv2.filter2D(img, -1, kernel) # 做卷积 img = img - lapkernel_img return img def non_sharpening(img): blur_img = cv2.blur(img, (5, 5)) mask_img = img - blur_img img = img + mask_img return img img = cv2.imread(filename='img/CB.61.20211203152034_crop_0.jpg', flags=1) result = handle(MEDTH_ID, img) print('原图的清晰度:', getImageVar(img)) print('处理之后的清晰度', getImageVar(result)) fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(10, 8), dpi=100) axes[0].imshow(img) axes[0].set_title("原图") axes[1].imshow(result) axes[1].set_title("处理之后的图片") plt.show()

      线性变换

      • 用处

      线性变换主要可以对图像的对比度和亮度进行调整(但是比较暴力),线性变换公式如下: f ( x , y ) = f ( x , y ) ∗ a + b f(x,y)=f(x,y)*a+b f(x,y)=f(x,y)∗a+b,参数 a 影响图像的对比度,参数 b 影响图像的亮度,具体分为可分为以下几种情况:

      • a>1:增强图像的对比度,图像看起来更加清晰
      • a<1: 减小了图像的对比度, 图像看起来变暗,
      • b>0:增加图像的亮度,图像变亮,
      • b<0:减少图像的亮度,图像变暗
      • a=-1 and b=255:图像翻转

      a=1.5,b=0的结果:

      分段线性变换

      • 对比度拉伸

      将原图的灰度范围限制为自定义范围,增强感兴趣区域。如将原来的 [ l m i n , l m a x ] [l_{min},l_{max}] [lmin​,lmax​]拉到 [ 0 , 255 ] [0,255] [0,255]

      • 阈值处理

      得到二值图,按照门限将灰度值变为0或者255

      • 灰度级分层

      为了在数字图像中突出我们感兴趣的灰度级区域 [A,B],在实际情况下可以有两种处理方式。

      突出灰度范围在 [A,B] 的区域,将其他区域灰度级降低到一个更低的级别突出灰度范围在 [A,B] 的区域,其他区域保持原灰度级不变

      对比度拉伸结果:

      对数变换

      • 用处

      对数变换将图像的低灰度值部分扩展,将其高灰度值部分压缩,以达到强调图像低灰度部分的目的;同时可以很好的压缩像素值变化较大的图像的动态范围,目的是突出我们需要的细节。

      反对数变换则与对数函数不同的是,强调的是图像的高灰度部分。

      结果:

      幂律变换

      • 用处

      幂律变换主要用于图像的校正,对漂白的图片或者是过黑的图片进行修正,根据 φ 的大小,主要可分为一下两种情况:

      • φ > 1: 处理漂白的图片,进行灰度级压缩
      • φ < 1: 处理过黑的图片,对比度增强,使得细节看的更加清楚

      直方图

      • 用处

      对比度较低的图像适合使用直方图均衡化方法来增强图像细节

      直方图均衡化结果:

      自适应直方图均衡化结果:

      图像滤波

      平滑图像

      通过模糊图像达到图像降噪的目的,但同时存在一个问题就是会使得图像的边缘被淡化。

      锐化图像

      主要目的是突出灰度的过渡部分,即突出图像的边缘(锐化空间滤波)

      图像锐化滤波中图像平滑是一个积分的过程,图像锐化便是通过图像微分增强边缘和其他突变,削弱灰度变换缓慢的区域。

      • laplacian算子

      其强调的是图像中灰度的变换,忽视图像灰度变换缓慢的区域。

      因此我们通过laplacian算子得出的是图像更多的是边缘线,因此,我们可以将原图和拉普拉斯图像叠加在一起,可以复原背景特性并且保持拉普拉斯锐化处理的效果。

      如何运用Python实现数字图像处理的长尾词技巧?

      • 用处

      可以增强局部的图像对比度

      结果:

      • 非锐化掩蔽

      非锐化掩蔽的思路便是应原图像减去平滑的图像,这样便得到强调边缘的图像,然后再和原图像相加,便达到强调图像边缘的效果,具体步骤如下:

      • 模糊原图像
      • 从原图像减去模糊图像(产生的差值图像称为模板)
      • 将模板和原图像相加

      结果:

      总结

      以上为个人经验,希望能给大家一个参考,也希望大家多多支持自由互联。