原文链接 https://jinkey.ai/post/tech/li-yong-keras-jin-xing-tu-pian-bian-yuan-jian-ce
本文作者 Jinkey(微信公众号 jinkey-love,官网 https://jinkey.ai)
文章允许非篡改署名转载,删除或修改本段版权信息转载的,视为侵犯知识产权,我们保留追求您法律责任的权利,特此声明!
依赖库
requirements.txt 内容如下
keras
numpy
pillow
工程目录结构
其中1.6.py为本教程脚本。要处理的示例图片:
图片预处理
# 打开图片(图片放在工程目录 img 文件夹下)
img = Image.open('img/test.png')
# 转换成灰度图是 "L",转换成RGB是"RGB"
img_gray = img.convert("L")
# 因为 keras 要求 2D 卷积层的输入的形状是 (宽, 高, 通道数),这里只有灰度值一个通道,所以对维度进行扩展
img_gray_array = np.expand_dims(np.array(img_gray), axis=2)
# img_gray_array.shape = (64, 64, 1)
创建卷积层
# 创建模型
model = kr.Sequential()
# 定义卷积核
def jk_kernel(shape):
return np.expand_dims(np.expand_dims(kernel, axis=2), axis=2)
# 添加卷积层
model.add(kr.layers.Conv2D(filters=1, kernel_size=3, kernel_initializer=jk_kernel, strides=1, padding='same', name='conv2d', input_shape=img_gray_array.shape))
# 编译模型
model.compile(optimizer='rmsprop', loss='categorical_crossentropy')
输出中间层的结果
conv2d_layer_model = kr.Model(inputs=model.input,
outputs=model.get_layer('conv2d').output)
conv2d_output = conv2d_layer_model.predict(np.expand_dims(img_gray_array, axis=0))
# conv2d_output.shape = (1, 64, 64, 1)
显示
# 缩减维度
img_gray_array_squeeze = np.squeeze(conv2d_output)
# 保存结果,也可以用 show() 方法来显示图片
Image.fromarray(img_gray_array_squeeze).convert('RGB').save(fp='img/edge.png')
输出的边缘检测结果为: