编程大实践 # python # 嵩天 # Cilay

图像增强

一、项目背景

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 fire


def hello(name="World"):
    return "Hello %s!" % name


if __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 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值