目录

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

基本概念

数字图像定义:对于一幅图像,我们可以将其放入坐标系中,这里取图像左上定点为坐标原点,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 mathimport cv2
import numpy as np
import matplotlib.pyplot as pltplt.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, 0for i in range(img.shape[0]):for j in range(img.shape[1]):if img[i][j] * a + b > 255:img[i][j] = 255else:img[i][j] = img[i][j] * a + breturn img# 分段线性变换-线性对比度拉伸,增强感兴趣区域
def linear_up(img):# 灰度值的最大最小值r_min, r_max = 255, 0for 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, 0r2, s2 = r_max, 255k = (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 imgdef 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_imgreturn imgdef non_sharpening(img):blur_img = cv2.blur(img, (5, 5))mask_img = img - blur_imgimg = img + mask_imgreturn imgimg = 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+bf(x,y)=f(x,y)*a+bf(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的结果:

分段线性变换

对比度拉伸:将原图的灰度范围限制为自定义范围,增强感兴趣区域。如将原来的[lmin,lmax][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】数字图像处理相关推荐

  1. python绘制灰度图片直方图-python数字图像处理实现直方图与均衡化

    在图像处理中,直方图是非常重要,也是非常有用的一个处理要素. 在skimage库中对直方图的处理,是放在exposure这个模块中. 1.计算直方图 函数:skimage.exposure.histo ...

  2. python数字图像处理(17):边缘与轮廓

    在前面的python数字图像处理(10):图像简单滤波 中,我们已经讲解了很多算子用来检测边缘,其中用得最多的canny算子边缘检测. 本篇我们讲解一些其它方法来检测轮廓. 1.查找轮廓(find_c ...

  3. 第1章 Python 数字图像处理(DIP) --绪论

    Python 数字图像处理 关于本专栏 此专栏为 Python 数字图像处理(DIP)(冈萨雷斯版),专栏里文章的内容都是来自书里,全部手打,非OCR,因为很多公式,都是用LaTex输入,力求更好看的 ...

  4. python数字图像处理以及绘图

    1, subplot的使用 matlab中的用法: subplot(m,n,p)或者subplot(m n p) subplot是将多个图画到一个平面上的工具.其中,m和n代表在一个图像窗口中显示m行 ...

  5. (附源码)python数字图像处理课程平台 毕业设计 242339

    Python数字图像处理课程平台的开发 摘 要 数字图像处理是一门新兴技术,随着计算机硬件的发展,数字图像的实时处理已经成为可能,由于数字图像处理的各种算法的出现,使得其处理速度越来越快,能更好的为人 ...

  6. (附源码)Python数字图像处理课程平台 毕业设计242339

    Python数字图像处理课程平台的开发 摘 要 数字图像处理是一门新兴技术,随着计算机硬件的发展,数字图像的实时处理已经成为可能,由于数字图像处理的各种算法的出现,使得其处理速度越来越快,能更好的为人 ...

  7. python数字图像处理(1):环境安装与配置

    一提到数字图像处理编程,可能大多数人就会想到matlab,但matlab也有自身的缺点: 1.不开源,价格贵 2.软件容量大.一般3G以上,高版本甚至达5G以上. 3.只能做研究,不易转化成软件. 因 ...

  8. 初始----python数字图像处理--:环境安装与配置

    一提到数字图像处理编程,可能大多数人就会想到matlab,但matlab也有自身的缺点: 1.不开源,价格贵 2.软件容量大.一般3G以上,高版本甚至达5G以上. 3.只能做研究,不易转化成软件. 因 ...

  9. Python数字图像处理---1.1图像的像素格式与图像读写

    目录 前言 图像像素格式 图像读写 前言 本专栏面向所有希望或有兴趣从事数字图像处理工作.学习或研究的朋友,编程语言采用了当下最火的Python语言. Python是一种跨平台的计算机设计语言,也是一 ...

  10. 一文总结Python数字图像处理基础知识与前沿应用

    介绍 数字图像处理由涉及在计算机上处理图像的各种技术和方法组成.对图像进行各种类型的操作,构成数字图像处理. 了解图像实际上是什么 图像基本上是二维信号.信号函数是 f(x,y),其中 x 和 y 在 ...

最新文章

  1. Linux动态频率调节系统CPUFreq之一:概述【转】-- 非常好的博客
  2. 机器学习需要理解的五个基本概念
  3. 基于uml的系统分析的网上商城_UML建模工具Enterprise Architect最新版有哪些新功能呢?立即查看...
  4. Slave: received end packet from server, apparent master shutdown:
  5. python3字符串拼接_Python3基础 str + 字符串变量拼接
  6. java中父类与子类, 不同的两个类中的因为构造函数由于递归调用导致栈溢出问题...
  7. 日常问题——pdsh localhost Connection refused
  8. android网格布局间距,android – 删除回收站视图网格布局中的默认间距
  9. OSChina 周六乱弹 —— 那些神一样的电视剧
  10. 打游戏的计算机,玩游戏还得台式机!高性能游戏台式电脑推荐
  11. perl脚本 linux,linux – 通过Perl脚本设置环境变量
  12. 毕业季怎么做答辩PPT?
  13. python·文本分析
  14. c语言三角函数精度不够,快速三角函数算法的误差控制(sin cos)
  15. 数学建模学习(100):交通运输问题建模
  16. 华为高端机mate20遇到了冲击高端手机市场的好时机
  17. 让最好用的印象笔记更好用
  18. 设计模式学习难度系数排名
  19. jmeter基础(二)-JMeter证书
  20. 微信小程序格式化数字在插值语法里面使用

热门文章

  1. civa机器人是什么_【小学英语-Civa机器人】|和Civa机器人一起学习,快乐成长
  2. input只能输入正整数,且第一个不能为0,不能输入小数点
  3. 特朗普:美国尚未与中国就中兴事宜达成任何协议
  4. 通信原理简明教程 | 现代数字调制
  5. 英文书 or 中文书?
  6. 利用正则爬取东方财富网股吧评论.py
  7. 既然上班如上坟,为什么还不辞职?
  8. Codeforces Round #770 (Div. 2) Problem B.Fortune Telling
  9. FireFox7.0 与 Chrome 的故事
  10. bp神经网络预测模型优点,bp神经网络缺点及克服