1
+ import cv2
2
+ import numpy as np
3
+ import matplotlib .pyplot as plt
4
+ import math
5
+
6
+ # 读取图片
7
+ img = cv2 .imread ('me1.jpg' )
8
+ src = cv2 .cvtColor (img , cv2 .COLOR_BGR2RGB )
9
+
10
+ # 新建目标图像
11
+ dst1 = np .zeros_like (img )
12
+
13
+ # 获取图像行和列
14
+ rows , cols = img .shape [:2 ]
15
+
16
+ # --------------毛玻璃效果--------------------
17
+ # 像素点邻域内随机像素点的颜色替代当前像素点的颜色
18
+ offsets = 5
19
+ random_num = 0
20
+ for y in range (rows - offsets ):
21
+ for x in range (cols - offsets ):
22
+ random_num = np .random .randint (0 , offsets )
23
+ dst1 [y , x ] = src [y + random_num , x + random_num ]
24
+
25
+ # -------油漆特效------------
26
+ # 图像灰度处理
27
+ gray = cv2 .cvtColor (img , cv2 .COLOR_BGR2GRAY )
28
+
29
+ # 自定义卷积核
30
+ kernel = np .array ([[- 1 , - 1 , - 1 ], [- 1 , 10 , - 1 ], [- 1 , - 1 , - 1 ]])
31
+
32
+ # 图像浮雕效果
33
+ dst2 = cv2 .filter2D (gray , - 1 , kernel )
34
+
35
+ # ----------素描特效-------------
36
+ # 高斯滤波降噪
37
+ gaussian = cv2 .GaussianBlur (gray , (5 , 5 ), 0 )
38
+
39
+ # Canny算子
40
+ canny = cv2 .Canny (gaussian , 50 , 150 )
41
+
42
+ # 阈值化处理
43
+ ret , dst3 = cv2 .threshold (canny , 100 , 255 , cv2 .THRESH_BINARY_INV )
44
+
45
+ # -------怀旧特效-----------------
46
+ # 新建目标图像
47
+ dst4 = np .zeros ((rows , cols , 3 ), dtype = "uint8" )
48
+
49
+ # 图像怀旧特效
50
+ for i in range (rows ):
51
+ for j in range (cols ):
52
+ B = 0.272 * img [i , j ][2 ] + 0.534 * img [i , j ][1 ] + 0.131 * img [i , j ][0 ]
53
+ G = 0.349 * img [i , j ][2 ] + 0.686 * img [i , j ][1 ] + 0.168 * img [i , j ][0 ]
54
+ R = 0.393 * img [i , j ][2 ] + 0.769 * img [i , j ][1 ] + 0.189 * img [i , j ][0 ]
55
+ if B > 255 :
56
+ B = 255
57
+ if G > 255 :
58
+ G = 255
59
+ if R > 255 :
60
+ R = 255
61
+ dst4 [i , j ] = np .uint8 ((B , G , R ))
62
+
63
+ # ---------------光照特效--------------------
64
+ # 设置中心点
65
+ centerX = rows / 2
66
+ centerY = cols / 2
67
+ print (centerX , centerY )
68
+ radius = min (centerX , centerY )
69
+ print (radius )
70
+
71
+ # 设置光照强度
72
+ strength = 200
73
+
74
+ # 新建目标图像
75
+ dst5 = np .zeros ((rows , cols , 3 ), dtype = "uint8" )
76
+
77
+ # 图像光照特效
78
+ for i in range (rows ):
79
+ for j in range (cols ):
80
+ # 计算当前点到光照中心的距离(平面坐标系中两点之间的距离)
81
+ distance = math .pow ((centerY - j ), 2 ) + math .pow ((centerX - i ), 2 )
82
+ # 获取原始图像
83
+ B = src [i , j ][0 ]
84
+ G = src [i , j ][1 ]
85
+ R = src [i , j ][2 ]
86
+ if (distance < radius * radius ):
87
+ # 按照距离大小计算增强的光照值
88
+ result = (int )(strength * (1.0 - math .sqrt (distance ) / radius ))
89
+ B = src [i , j ][0 ] + result
90
+ G = src [i , j ][1 ] + result
91
+ R = src [i , j ][2 ] + result
92
+ # 判断边界 防止越界
93
+ B = min (255 , max (0 , B ))
94
+ G = min (255 , max (0 , G ))
95
+ R = min (255 , max (0 , R ))
96
+ dst5 [i , j ] = np .uint8 ((B , G , R ))
97
+ else :
98
+ dst5 [i , j ] = np .uint8 ((B , G , R ))
99
+
100
+ # --------------怀旧特效-----------------
101
+ # 新建目标图像
102
+ dst6 = np .zeros ((rows , cols , 3 ), dtype = "uint8" )
103
+
104
+ # 图像流年特效
105
+ for i in range (rows ):
106
+ for j in range (cols ):
107
+ # B通道的数值开平方乘以参数12
108
+ B = math .sqrt (src [i , j ][0 ]) * 12
109
+ G = src [i , j ][1 ]
110
+ R = src [i , j ][2 ]
111
+ if B > 255 :
112
+ B = 255
113
+ dst6 [i , j ] = np .uint8 ((B , G , R ))
114
+
115
+ # ------------卡通特效-------------------
116
+ # 定义双边滤波的数目
117
+ num_bilateral = 7
118
+
119
+ # 用高斯金字塔降低取样
120
+ img_color = src
121
+
122
+ # 双边滤波处理
123
+ for i in range (num_bilateral ):
124
+ img_color = cv2 .bilateralFilter (img_color , d = 9 , sigmaColor = 9 , sigmaSpace = 7 )
125
+
126
+ # 灰度图像转换
127
+ img_gray = cv2 .cvtColor (src , cv2 .COLOR_RGB2GRAY )
128
+
129
+ # 中值滤波处理
130
+ img_blur = cv2 .medianBlur (img_gray , 7 )
131
+
132
+ # 边缘检测及自适应阈值化处理
133
+ img_edge = cv2 .adaptiveThreshold (img_blur , 255 ,
134
+ cv2 .ADAPTIVE_THRESH_MEAN_C ,
135
+ cv2 .THRESH_BINARY ,
136
+ blockSize = 9 ,
137
+ C = 2 )
138
+
139
+ # 转换回彩色图像
140
+ img_edge = cv2 .cvtColor (img_edge , cv2 .COLOR_GRAY2RGB )
141
+
142
+ # 与运算
143
+ dst6 = cv2 .bitwise_and (img_color , img_edge )
144
+
145
+ # ------------------均衡化特效--------------------
146
+ # 新建目标图像
147
+ dst7 = np .zeros ((rows , cols , 3 ), dtype = "uint8" )
148
+
149
+ # 提取三个颜色通道
150
+ (b , g , r ) = cv2 .split (src )
151
+
152
+ # 彩色图像均衡化
153
+ bH = cv2 .equalizeHist (b )
154
+ gH = cv2 .equalizeHist (g )
155
+ rH = cv2 .equalizeHist (r )
156
+
157
+ # 合并通道
158
+ dst7 = cv2 .merge ((bH , gH , rH ))
159
+
160
+ # -----------边缘特效---------------------
161
+ # 高斯滤波降噪
162
+ gaussian = cv2 .GaussianBlur (gray , (3 , 3 ), 0 )
163
+
164
+ # Canny算子
165
+ # dst8 = cv2.Canny(gaussian, 50, 150)
166
+
167
+ # Scharr算子
168
+ x = cv2 .Scharr (gaussian , cv2 .CV_32F , 1 , 0 ) # X方向
169
+ y = cv2 .Scharr (gaussian , cv2 .CV_32F , 0 , 1 ) # Y方向
170
+ absX = cv2 .convertScaleAbs (x )
171
+ absY = cv2 .convertScaleAbs (y )
172
+ dst8 = cv2 .addWeighted (absX , 0.5 , absY , 0.5 , 0 )
173
+
174
+
175
+ # 用来正常显示中文标签
176
+ plt .rcParams ['font.sans-serif' ] = ['SimHei' ]
177
+
178
+ # 循环显示图形
179
+ titles = ['原图' , '毛玻璃' , '浮雕' , '素描' , '怀旧' , '光照' , '卡通' , '均衡化' , '边缘' ]
180
+ images = [src , dst1 , dst2 , dst3 , dst4 , dst5 , dst6 , dst7 , dst8 ]
181
+ for i in range (9 ):
182
+ plt .subplot (3 , 3 , i + 1 ), plt .imshow (images [i ], 'gray' )
183
+ plt .title (titles [i ])
184
+ plt .xticks ([]), plt .yticks ([])
185
+
186
+ if __name__ == '__main__' :
187
+
188
+ plt .show ()
0 commit comments