- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章python 图像增强算法实现详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
使用python编写了共六种图像增强算法:
1)基于直方图均衡化 2)基于拉普拉斯算子 3)基于对数变换 4)基于伽马变换 5)限制对比度自适应直方图均衡化:clahe 6)retinex-ssr 7)retinex-msr其中,6和7属于同一种下的变化。 将每种方法编写成一个函数,封装,可以直接在主函数中调用。 采用同一幅图进行效果对比.
直方图均衡化:对比度较低的图像适合使用直方图均衡化方法来增强图像细节 拉普拉斯算子可以增强局部的图像对比度 log对数变换对于整体对比度偏低并且灰度值偏低的图像增强效果较好 伽马变换对于图像对比度偏低,并且整体亮度值偏高(对于相机过曝)情况下的图像增强效果明显 clahe和retinex的效果均较好 。
python代码为:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
|
# 图像增强算法,图像锐化算法
# 1)基于直方图均衡化 2)基于拉普拉斯算子 3)基于对数变换 4)基于伽马变换 5)clahe 6)retinex-ssr 7)retinex-msr
# 其中,基于拉普拉斯算子的图像增强为利用空域卷积运算实现滤波
# 基于同一图像对比增强效果
# 直方图均衡化:对比度较低的图像适合使用直方图均衡化方法来增强图像细节
# 拉普拉斯算子可以增强局部的图像对比度
# log对数变换对于整体对比度偏低并且灰度值偏低的图像增强效果较好
# 伽马变换对于图像对比度偏低,并且整体亮度值偏高(对于相机过曝)情况下的图像增强效果明显
import
cv2
import
numpy as np
import
matplotlib.pyplot as plt
# 直方图均衡增强
def
hist(image):
r, g, b
=
cv2.split(image)
r1
=
cv2.equalizehist(r)
g1
=
cv2.equalizehist(g)
b1
=
cv2.equalizehist(b)
image_equal_clo
=
cv2.merge([r1, g1, b1])
return
image_equal_clo
# 拉普拉斯算子
def
laplacian(image):
kernel
=
np.array([[
0
,
-
1
,
0
], [
-
1
,
5
,
-
1
], [
0
,
-
1
,
0
]])
image_lap
=
cv2.filter2d(image, cv2.cv_8uc3, kernel)
return
image_lap
# 对数变换
def
log(image):
image_log
=
np.uint8(np.log(np.array(image)
+
1
))
cv2.normalize(image_log, image_log,
0
,
255
, cv2.norm_minmax)
# 转换成8bit图像显示
cv2.convertscaleabs(image_log, image_log)
return
image_log
# 伽马变换
def
gamma(image):
fgamma
=
2
image_gamma
=
np.uint8(np.power((np.array(image)
/
255.0
), fgamma)
*
255.0
)
cv2.normalize(image_gamma, image_gamma,
0
,
255
, cv2.norm_minmax)
cv2.convertscaleabs(image_gamma, image_gamma)
return
image_gamma
# 限制对比度自适应直方图均衡化clahe
def
clahe(image):
b, g, r
=
cv2.split(image)
clahe
=
cv2.createclahe(cliplimit
=
2.0
, tilegridsize
=
(
8
,
8
))
b
=
clahe.
apply
(b)
g
=
clahe.
apply
(g)
r
=
clahe.
apply
(r)
image_clahe
=
cv2.merge([b, g, r])
return
image_clahe
def
replacezeroes(data):
min_nonzero
=
min
(data[np.nonzero(data)])
data[data
=
=
0
]
=
min_nonzero
return
data
# retinex ssr
def
ssr(src_img, size):
l_blur
=
cv2.gaussianblur(src_img, (size, size),
0
)
img
=
replacezeroes(src_img)
l_blur
=
replacezeroes(l_blur)
dst_img
=
cv2.log(img
/
255.0
)
dst_lblur
=
cv2.log(l_blur
/
255.0
)
dst_ixl
=
cv2.multiply(dst_img, dst_lblur)
log_r
=
cv2.subtract(dst_img, dst_ixl)
dst_r
=
cv2.normalize(log_r,none,
0
,
255
, cv2.norm_minmax)
log_uint8
=
cv2.convertscaleabs(dst_r)
return
log_uint8
def
ssr_image(image):
size
=
3
b_gray, g_gray, r_gray
=
cv2.split(image)
b_gray
=
ssr(b_gray, size)
g_gray
=
ssr(g_gray, size)
r_gray
=
ssr(r_gray, size)
result
=
cv2.merge([b_gray, g_gray, r_gray])
return
result
# retinex mmr
def
msr(img, scales):
weight
=
1
/
3.0
scales_size
=
len
(scales)
h, w
=
img.shape[:
2
]
log_r
=
np.zeros((h, w), dtype
=
np.float32)
for
i
in
range
(scales_size):
img
=
replacezeroes(img)
l_blur
=
cv2.gaussianblur(img, (scales[i], scales[i]),
0
)
l_blur
=
replacezeroes(l_blur)
dst_img
=
cv2.log(img
/
255.0
)
dst_lblur
=
cv2.log(l_blur
/
255.0
)
dst_ixl
=
cv2.multiply(dst_img, dst_lblur)
log_r
+
=
weight
*
cv2.subtract(dst_img, dst_ixl)
dst_r
=
cv2.normalize(log_r,none,
0
,
255
, cv2.norm_minmax)
log_uint8
=
cv2.convertscaleabs(dst_r)
return
log_uint8
def
msr_image(image):
scales
=
[
15
,
101
,
301
]
# [3,5,9]
b_gray, g_gray, r_gray
=
cv2.split(image)
b_gray
=
msr(b_gray, scales)
g_gray
=
msr(g_gray, scales)
r_gray
=
msr(r_gray, scales)
result
=
cv2.merge([b_gray, g_gray, r_gray])
return
result
if
__name__
=
=
"__main__"
:
image
=
cv2.imread(
"example.jpg"
)
image_gray
=
cv2.cvtcolor(image, cv2.color_bgr2gray)
plt.subplot(
4
,
2
,
1
)
plt.imshow(image)
plt.axis(
'off'
)
plt.title(
'offical'
)
# 直方图均衡增强
image_equal_clo
=
hist(image)
plt.subplot(
4
,
2
,
2
)
plt.imshow(image_equal_clo)
plt.axis(
'off'
)
plt.title(
'equal_enhance'
)
# 拉普拉斯算法增强
image_lap
=
laplacian(image)
plt.subplot(
4
,
2
,
3
)
plt.imshow(image_lap)
plt.axis(
'off'
)
plt.title(
'laplacian_enhance'
)
# log对象算法增强
image_log
=
log(image)
plt.subplot(
4
,
2
,
4
)
plt.imshow(image_log)
plt.axis(
'off'
)
plt.title(
'log_enhance'
)
# 伽马变换
image_gamma
=
gamma(image)
plt.subplot(
4
,
2
,
5
)
plt.imshow(image_gamma)
plt.axis(
'off'
)
plt.title(
'gamma_enhance'
)
# clahe
image_clahe
=
clahe(image)
plt.subplot(
4
,
2
,
6
)
plt.imshow(image_clahe)
plt.axis(
'off'
)
plt.title(
'clahe'
)
# retinex_ssr
image_ssr
=
ssr_image(image)
plt.subplot(
4
,
2
,
7
)
plt.imshow(image_ssr)
plt.axis(
'off'
)
plt.title(
'ssr'
)
# retinex_msr
image_msr
=
msr_image(image)
plt.subplot(
4
,
2
,
8
)
plt.imshow(image_msr)
plt.axis(
'off'
)
plt.title(
'msr'
)
plt.show()
|
增强效果如下图所示:
到此这篇关于python 图像增强算法实现详解的文章就介绍到这了,更多相关python 图像增强算法内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。
原文链接:https://blog.csdn.net/Wadewhl/article/details/112918863 。
最后此篇关于python 图像增强算法实现详解的文章就讲到这里了,如果你想了解更多关于python 图像增强算法实现详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在尝试使用增强的 for 循环遍历 Iterable,但我无法确定何时处理最后一个值。 public void apply(Tuple key,
我正在使用以下代码在 Sheet2 的 A:H 范围内查找和替换 Sheet1 中存在的单词列表(ColA 用于 FIND 单词,ColB 用于 REPLACE 单词)。它执行这项工作,但非常缓慢。可
我正在使用 Hibernate (JPA2) hibernate.hbm2ddl.auto=update用于测试和 hibernate.hbm2ddl.auto=validate用于生产。 我想要做的
基本问题: 为什么我只能用 Scala 编写: println(10) 为什么我不需要写: Console println(10) 后续问题: 如何引入一个新方法“foo”,它像“println”一样
我正在尝试将 Maven 项目迁移到 Bazel,但在 Datanucleus 增强方面遇到了麻烦。 后 jar -file 已构建,Datanucleus 会查看其中的内部并执行一些字节码操作以增强
正在使用 css3 转换进行漂亮的导航。为此还编写了一些 javascript。 但不幸的是它看起来有点凌乱。你们能给我一些优化 javascript 代码的技巧吗? 笔--> http://code
我想将自定义任务绑定(bind)到默认构建器发布周期中。我想在项目编译、打包、标记和部署之后但在增加版本号并提交之前运行此代码。 我将如何融入发布周期的这一部分? 最佳答案 不幸的是,release
我使用ElasticSearch 6.6。我的应用程序通过从不同数据源提取数据来构建ES索引。搜索未指定数据源。它只是建立一个类似的查询: GET employerdata/_search { "
我正在使用此代码将“k1 = v1; k2 = v2; k3 = v3; kn = vn”字符串解析为映射。 qi::phrase_parse( begin,end,
我正在试图弄清楚作业的一部分,但我已经把头撞在墙上有一段时间了。我正在尝试将 DNA 序列转录为 RNA 序列。然而,我收到了 ArrayOutOfBoundsException。我不熟悉使用增强的
我需要对基于 python Google App Engine 的应用程序的警告进行分类。我从 GAE stackdriver 下载日志。我认为 GAE Stackdriver 错误报告位于 http
我有一个 django charField,通过 is_valid() 方法进行检查。用户应该在此字段中输入有效的逻辑表达式,因此我编写了一个解析方法,如果表达式不正确,该方法会引发异常。 如何增强
我编写了以下控制台应用程序,要求用户输入一天。 我需要一些帮助才能改进,以便他们为一周中的所有日子提供正确的答案。 如果用户输入除星期一以外的任何其他日期,则输出为“今天”、“昨天”、“明天”,并在这
我在使用带有 ES6 let 关键字的模块模式(扩充)时遇到错误。 这有效。 var Example = ( Example => { Example.name = ""; retur
我只是问是否线程安全可以使用 我明确指出“doSomething()”是线程安全的。 最佳答案 线程安全取决于您正在迭代的 Collection,而不是 enhanced for 的使用。如果 Col
我有一个非常符合 this Jquery demo 的要求,这是一个简单的购物车演示。基本上,我需要对该演示进行两项改进。 我需要文本输入以及可用的“产品”。因此,当我拖放其中一种产品时,文本字段应随
我正在三个表 messages、message_recipients 和 users 上运行查询。 messages表的表结构: id int pk message_id int message te
这个问题已经有答案了: In detail, how does the 'for each' loop work in Java? (29 个回答) 已关闭 4 年前。 由于增强的 for 循环是只读
我在 css 中制作了一个很酷的鼠标悬停,当父级鼠标悬停时它会显示动画 gif。 这是我的代码:http://codepen.io/clemeeent/pen/oggzMa 问题是我将有大约 40 天
目前,当使用 Knockout foreach 绑定(bind)时,您可以使用 $index 访问当前索引。我想让其他类似的功能可用于我的内部绑定(bind) - 例如: array(让我访问正在操作
我是一名优秀的程序员,十分优秀!