利用 Keras 进行图片边缘检测 —— Jinkey 原创

937 阅读1分钟

原文链接 jinkey.ai/post/tech/l…
本文作者 Jinkey(微信公众号 jinkey-love,官网 jinkey.ai
文章允许非篡改署名转载,删除或修改本段版权信息转载的,视为侵犯知识产权,我们保留追求您法律责任的权利,特此声明!

依赖库

requirements.txt 内容如下

keras
numpy
pillow

工程目录结构


其中1.6.py为本教程脚本。要处理的示例图片:


test.png

图片预处理

# 打开图片(图片放在工程目录 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')

输出的边缘检测结果为:


edge.png