图像增强

一、项目背景

1.图像增强

图像增强是指增强图像中的有用信息,它可以是一个失真的过程,其目的是要改善图像的视觉效果,针对给定图像的应用场合。

有目的地强调图像的整体或局部特性,将原来不清晰的图像变得清晰或强调某些感兴趣的特征,扩大图像中不同物体特征之间的差别,抑制不感兴趣的特征,使之改善图像质量、丰富信息量,加强图像判读和识别效果,满足某些特殊分析的需要。

2.图像插值技术

如图所示, 图像插值如下图所示,一幅图像由许多像素点组成,当图像放大两倍时, 需要使用N(低分辨率像素的数目)个己知像素值估计出 3N 个未知像素值。

如果图像插值算法性能不理想, 将会使得放大后的图像模糊、失真, 甚至难以分辨, 图像插值算法也可以用于缩小图像。

3.常见差值算法

  • 线性插值

    • 最近邻插值

    • 双线性插值

    • 双三次插值

  • 非线性插值

    • 基于边缘信息

    • 基于小波基数

4.最邻近差值

最近邻插值算法又称为零阶插值算法, 即令插值后的图像像素的值等于距离它最近的像素的值, 这种方法失真严重但运算简单, 最邻近插值算法的基本插值公式如下:

I_h(i + u, j + v) = I_l(i, j)

下图展示了最近邻插值算法的插值过程, 其中黑色点位低分辨率图像已知的像素点, 白色点为高分辨率图像待插值的像素点。

5.双线性插值

这种方法最常用, 是opencv的**resize()**函数的默认值,双线性插值算法中待查值的点的值是原始低分辨率图像与其相邻的 4 个已知点的像素值的加权平均, 即利用相邻 4 个点的像素值对待插值的点的像素值进行线性估计。以水平方向为例, 做一次线性插值, 插值满足下式:

\frac{f(x_2) - f(x_1)}{x_2 - x_1} = \frac{f(x)- f(x_1)}{x - x_1}

需要满足

x_1 \leq x \leq x_2, x_2 = x_1 + 1

则目标点的插值结果为

f(x) = (x_2 - x)f(x_1) + (x - x_1)f(x_2)

上述插值公式其实就是将和的像素值看作两个点, 做一条线段, 为线段上一点, 与的距离就可以对应到在线段上距的距离, 与的距离也可以对应到在线段上距的距离, 距越近对的影响就越大, 距越近对的影响就越大。

同理可以得到竖直方向上的插值公式:

f(y) = (y_2 - y)f(y_1) + (y - y_1)f(y_2)

而双线性插值可以看作是先在水平方向做两次线性插值,再在竖直方向上对前面的两个插值结果做一次线性插值,具体如下图所示, 其中黑色点位低分辨率图像已知的像素点, 点 F 为待插值的点, E, G 为辅助点。

A 点与 C 点做一次水平方向上的线性插值得到 E 点, B 点与 D 点做一次水平方向上的线性插值得到 G 点, E 点与 G 点做一次竖直方向上的线性插值即可得到 F 点, 具体公式如下:

E 点:

G 点:

F 点:

最终可以得到双线性插值公式:

I_h(i + u, j + v) = v(u(I_l(i + 1, j + 1)) + (1 - u)I_l(i, j + 1)) + (1 - v)(uI_l(i + 1, j) + (1 - u)I_l(i, j))

化简得:

I_h(i + u, j + v) = (1 - u)(1 - v)\cdot I_l(i, j) + (1 - u)v\cdot I_l(i, j + 1) + u(1 - v)\cdot I_l(i + 1, j) + uv\cdot I_l(i + 1, j + 1)

6.上采样(放大图像)

以双线性插值为例, 所有变换以水平方向的宽度为例, 竖直方向上的高度同理。

假如要将 的图像插值成 的图像, 则在水平方向上的宽比为 , 高分辨率图像的水平方向坐标变换为 ( 为低分辨率图像中的浮点数坐标, 为高分辨率图像中的整数坐标)。

如高分辨率图像中 的点对应输入图像中 的点, 设为 , 找到 周围的四个点分别为 , 则 处的值为:

f_P = 0.4\cdot f_{(0, 0)} + 0.6\cdot f_{(0, 1)} + 0 \cdot f_{(1, 0)} + 0 \cdot f_{(1, 1)}

其余点同理,但是这样会产生一个问题, 插值时有的点的坐标已经超出了原图的坐标范围, 依然以 的图像插值成 的图像为例, 在水平方向上, 的图像的坐标为, 最后一个坐标 已经超出了原图像的水平方向上的坐标范围(0, 1, 2), 再假如是, 的图像放大为 的图像,一个方向的坐标就有, 其中有两个坐标()超出了原图的坐标范围。

一个处理方式时将超出的坐标插值中需要使用到的不存在的点的像素值设置为白色(或者其他固定颜色), 这中处理方法计算上简单, 但是效果不太好, 这里提供一种效果较好的处理方法,我们将坐标变换修改为:

Y = \frac{w_0 - 1}{w}X

其中 为低分辨率图像宽度, 为高分辨率图像宽度,这样 图像水平方向上的坐标值变为, 图像水平方向上的坐标值变 , 这样所有的点都存在四个相邻的点了。

这里还会有一个问题, 这个问题在下采样中更加明显, 我们将在下采样中说明这个问题。

7.下采样(缩小图像)

以双线性插值为例, 所有变换以水平方向的宽度为例, 竖直方向上的高度同理。

假如要将 的图像插值成 的图像, 则在水平方向上的宽比为 , 高分辨率图像的水平方向坐标变换为 , ( 为原始图像中的浮点数坐标, 为缩小后图像中的整数坐标)这里不存在点超出原图坐标范围的问题。

如缩小后图像中 的点对应原始图像中 的点, 设为 , 找到 周围的四个点分别为 , 则 处的值为:

f_Q = 0.33\cdot f_{(0, 1)} + 0.67\cdot f_{(0, 2)} + 0 \cdot f_{(1, 1)} + 0 \cdot f_{(1, 2)}

其余点同理,这里存在一个问题, 我们对左上角的点的利用会比对右下角的点的利用率更高, 如下图所示, 蓝色的点为原始图像上的点, 红色的点为缩小后图像上的点, 可以看到, 缩小后图像上的点整体为与原始图像的左上角, 导致原始图像左上角的点的权值更高。

若考虑将 的图像插值成 的图像, 则会出现更严重的问题, 如下图所示, 下图中最右边一列和最下面一行的点直接被忽略了, 插值时没有用到它们。

上采样也存在这个问题, 但是上采样只存在左上角的点权值更高的问题而不存在右下角部分的被忽略的问题,解决这个问题的方法时将两个图像的几何中心对齐, 相当于将图中红色部分向右下方移动他们宽度差的一半, 即移动 (其中 为原始图像宽度, 为缩小后图像宽度), 因此坐标变换变为:

Y = (X + 0.5) \times \frac{w_0}{w} - 0.5

同理, 上采样的坐标变化变为:

Y = (X + 0.5) \times \frac{w_0 - 1}{w} - 0.5

二、项目目标

1.主要目标()

通过命令行参数传入原始图像路径,生成图像途径,生成图片高度和宽度等参数,进行图像增强处理,包括:最邻近差值和双线性差值。

2.目标分解

  • 解析命令行参数

  • 对图像文件处理

  • 输出到指定位置

三、技术选型

1.问题:是否可以直接使用opencv 或其他图像处理库的缩放函数?

可以使用图像处理库和函数,但仅限于读入图片和生成图片操作,否则本项目毫无意义。

2.问题:如何解析命令行参数?

fire是python中用于生成命令行界面(Command Line Interfaces, CLIs)的工具,不需要做任何额外的工作,只需要从主模块(主函数入口)中调用fire.Fire(),它会自动将你的代码转化为CLI,Fire()的参数可以说任何的python对象。GitHub - google/python-fire: Python Fire is a library for automatically generating command line interfaces (CLIs) from absolutely any Python object.

--javascripttypescriptbashsqljsonhtmlcssccppjavarubypythongorustmarkdown

pip install fire

基本用法

--javascripttypescriptbashsqljsonhtmlcssccppjavarubypythongorustmarkdown

import firedef hello(name="World"):return "Hello %s!" % nameif __name__ == '__main__':fire.Fire(hello)

--javascripttypescriptbashsqljsonhtmlcssccppjavarubypythongorustmarkdown

python hello.py  # Hello World!
python hello.py --name=David  # Hello David!
python hello.py --help  # Shows usage information.

3.问题:如何安装OpenCV?

opencv库的安装名称为opencv-python。https://github.com/opencv/opencv-python

--javascripttypescriptbashsqljsonhtmlcssccppjavarubypythongorustmarkdown

pip install opencv-python

基本使用方法

--javascripttypescriptbashsqljsonhtmlcssccppjavarubypythongorustmarkdown

#导入CV2库
import cv2.cv2 as cv2
print('库文件导入成功')
#读取图像
img = cv2.imread('mofang.jpg')
#显示图像
cv2.imshow('Output',img) #其中Output为显示文件名,img为想要显示图片的代码
#添加延迟ms
cv2.waitKey(0)

4.问题:使用那种图像处理库?

推荐使用NumPy库进行图像矩阵的处理,如果没有使用过,需要一定的学习成本,这点请注意。不过友好的一点是NumPy库文档中的示例非常多,你能轻松的找到。NumPy documentation — NumPy v1.23 Manual

四、课堂要求

1.提交项目结构

--javascripttypescriptbashsqljsonhtmlcssccppjavarubypythongorustmarkdown

C- ImageEnhance.c        图像增强程序编写文件
Python- ImageEnhance.py   图像增强程序编写文件
README.md                       项目描述说明文档
test.png                一张程序测试图片
requirements.txt        项目依赖包版本号(项目需要下载到本地执行,如果有第三方依赖包,必须填写)

2.标注核心算法函数位置

--javascripttypescriptbashsqljsonhtmlcssccppjavarubypythongorustmarkdown

# 最邻近差值 位于ImageEnhance.py文件 第54行if algorithm == 'nearest':# 最近邻插值...

--javascripttypescriptbashsqljsonhtmlcssccppjavarubypythongorustmarkdown

# 双线性插值 位于ImageEnhance.py文件 第63行elif algorithm == 'bilinear':# 双线性插值...

3.程序运行效果截图

项目全部代码及资源包和相关文档:https://download.csdn.net/download/weixin_57557097/86539993

编程大实践 # python # 嵩天 # Cilay相关推荐

  1. 高德地图找房 # 编程大实践 # Python # 嵩天 # cilay

    高德地图找房 一.项目背景 1.高德开放平台 高德开放平台是国内技术领先的LBS服务提供商,拥有先进的数据融合技术和海量的数据处理能力. 服务超过三十万款移动应用,日均处理定位请求及路径规划数百亿次. ...

  2. 编程大实践 数独破解 #Cilay #嵩天

    图形界面数独游戏 一.项目背景 1.数独 **数独(Sudoku)**是一种数学逻辑游戏,游戏由9×9个格子组成,玩家需要根据格子提供的数字推理出其他格子的数字. 这种游戏只需要逻辑思维能力,与数字运 ...

  3. python是什么语言开发的-少儿编程有什么好处?儿童编程课程学习Python的4大原因...

    儿童编程Python是什么课程? Python是强制用一种面向对象的解释型计算机程序设计语言,它是纯粹的自由软件, 源代码和解释器CPython遵循 GPL(GNU General Public Li ...

  4. python录入学生信息网_干货满满 | Python趣味编程教学实践

    Python趣味编程教学实践 近几年间,Python 的火热有目共睹,在IEEE Spectrum 2020 编程语言 Top 10排行榜中,Python位居第一.这是因为Python 与人工智能.机 ...

  5. python 人工智能课程对孩子的好处_少儿编程有什么好处?儿童编程课程学习Python的4大原因...

    儿童编程Python是什么课程? Python是强制用一种面向对象的解释型计算机程序设计语言,它是纯粹的自由软件, 源代码和解释器CPython遵循 GPL(GNU General Public Li ...

  6. python统计套利_清华编程高手尹成带你基于算法实践python量化交易

    清华编程高手尹成带你基于算法实践python量化交易 量化交易是指以先进的数学模型替代人为的主观判断,利用计算机技术从庞大的历史数据中海选能带来超额收益的多种"大概率"事件以制定策 ...

  7. Spark综合大作业:RDD编程初级实践

    Spark综合大作业:RDD编程初级实践 实验配置:操作系统:Ubuntu16.04 | 环境:Spark版本:2.4.0 | 软件:Python版本:3.4.3. 文章目录 一.实验目的 二.实验平 ...

  8. python一元线性回归算法_6一元线性回归_清华编程高手尹成带你基于算法实践python量化交易_其他视频-51CTO学院...

    清华编程高手尹成带你基于算法实践python量化交易 量化交易是指以先进的数学模型替代人为的主观判断,利用计算机技术从庞大的历史数据中海选能带来超额收益的多种"大概率"事件以制定策 ...

  9. python算法交易工程师_清华编程高手尹成带你基于算法实践python量化交易

    清华编程高手尹成带你基于算法实践python量化交易 量化交易是指以先进的数学模型替代人为的主观判断,利用计算机技术从庞大的历史数据中海选能带来超额收益的多种"大概率"事件以制定策 ...

最新文章

  1. 手把手教你使用YOLOV5训练自己的数据集并用TensorRT加速
  2. mybaits十九:bind绑定
  3. wcdma系统随机接入过程的流程图_重庆:降低轨道场景多系统合路互调干扰的研究...
  4. graph driver-device mapper-04libdevmapper基本操作
  5. nstimer循环引用_ios开发中经典循环引用场景?
  6. php 获取内容页图片,织梦DEDECMS内容页获取图片URL地址的方法
  7. 漫话:如何给女朋友解释为什么一到年底,部分网站就会出现日期混乱的现象?...
  8. 中文分词算法工具hanlp源码解析
  9. Ubuntu中EasyPR环境配置
  10. 用计算机解决线性代数,线性代数问题计算机应用.doc
  11. OSError: [WinError 127] 找不到指定的程序。 Error loading “C:\Anaconda3\envs\Machine_Learning\lib\site-package
  12. 阿里用技术帮用户剁手——《尽在双11——阿里巴巴技术演进与超越》
  13. 使用Arduino UNO以及好盈电调控制无刷电机
  14. Gerrit升级和升级后的check(包括gerrit mirror 服务器上的升级)
  15. android zooming bitmap
  16. 全地形爆破赛小车的制作分享
  17. 【BZOJ4424】Cf19E Fairy DFS树
  18. matlab有限域多项式除法_有限域GF(2^8)的四则运算及拉格朗日插值
  19. 基于ARIMA对我国居民消费价格指数的分析
  20. Microsoft Jet SQL for Access 2000 IV

热门文章

  1. python 用户信息管理系统【各个函数剖析 + 完整代码 零基础适用篇】
  2. 误码率SER和误比特率BER的关系
  3. 超融合基础架构HCI新特性
  4. 微信小程序 - 图片占位图
  5. Excel表格自动转Json数据
  6. 一款能生成NC文件(雕刻路径文件)的 inkscape ,想必很多人都找不到能用的
  7. (七)MySQL视图
  8. Windows 下安装 CUDA 和 Pytorch
  9. R语言可视化世界地图:包含边界边框和不包含边界边框两种方案
  10. 赋能聚变:大连软件产业20年发展论坛成功举办