本文首发于个人blog:http://booleflow.com/
主要基于OpenCV
以下所有代码在mac python3 jupyter notebook下测试通过。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from __future__ import division
from __future__ import print_function
%matplotlib inline
# 本文中主要使用cv2处理图片,但不利于在notebook中展示,所以使用plt输出前做简单处理
def img_convert(cv2_img):
"""
cv2使用BGR,plt使用RGB
包含灰度,3通道,4通道
下面这个不好使
ret_img = cv2.cvtColor(ret_img, cv2.COLOR_BGR2RGB)
"""
if len(cv2_img.shape) == 2:
return cv2_img
elif len(cv2_img.shape) == 3 and cv2_img.shape[2] == 3:
b, g, r = cv2.split(cv2_img)
return cv2.merge((r, g, b))
elif len(cv2_img.shape) == 3 and cv2_img.shape[2] == 4:
b, g, r, a = cv2.split(cv2_img)
return cv2.merge((r, g, b, a))
else:
return cv2_img
阈值
threshold 简单阈值
介绍
顾名思义,通过阈值处理,大于为1,小于则为0,使用函数cv2.threshold()。参数解释如下:
ret, dst = cv2.threshold (src, thresh, maxval, type)
- src:源图片,必须是单通道
- dst:输出图
- thresh:阈值,取值范围0~255
- maxval:填充色,取值范围0~255
- type:阈值类型,具体见下表
type还可以写为如下:
type:二值化操作的类型,包含以下5种类型: cv2.THRESH_BINARY; cv2.THRESH_BINARY_INV; cv2.THRESH_TRUNC; cv2.THRESH_TOZERO;cv2.THRESH_TOZERO_INV
实现
import numpy as np
import cv2
import matplotlib.pyplot as plt
ori_img = cv2.imread('../Fast_neural_style/img_d2cfac63.jpeg')
# 现转化为单通道图
img_gray = cv2.cvtColor(ori_img, cv2.COLOR_RGB2GRAY)
imgs = [ori_img] + [img_gray]
title = ['ori_img', 'img_gray']
# 简单阈值处理
for typ in range(0, 5, 1):
_, thresh = cv2.threshold(img_gray, 150, 255, type=typ)
title.append('type_' + str(typ))
imgs = imgs + [thresh]
# 可视化
plt.figure(figsize=(12,6))
for i in range(7):
plt.subplot(2, 4, i + 1), plt.imshow(img_convert(imgs[i]), 'gray')
plt.title(title[i])
plt.show()
adaptiveThreshold 自适应阈值
介绍
简单阈值对图片对处理过于简单粗暴,特别是对对色彩复杂图片,处理后很多细节都无法复现。自适应阈值则根据图像上的每个小区域计算与其对应的阈值,不同区域采用不同阈值。可使用cv2.adaptiveThreshold()实现。参数解释如下:
dst = cv2.adaptiveThreshold(src, maxval, thresh_type, type, Block Size, C)
- src:源图片,只能输入单通道图像
- dst: 输出图
- maxval: 当像素值超过了阈值(或者小于阈值,根据type来决定),所赋予的值
- thresh_type: 阈值的计算方法,包含以下2种类型:cv2.ADAPTIVE_THRESH_MEAN_C,阈值即取相邻领域的平均值; cv2.ADAPTIVE_THRESH_GAUSSIAN_C,阈值同样取自相邻领域,只是不再是平均值,而是加权平均,权重为一个高斯窗口
- type:二值化操作的类型,与固定阈值函数相同,包含以下5种类型: cv2.THRESH_BINARY; cv2.THRESH_BINARY_INV; cv2.THRESH_TRUNC; cv2.THRESH_TOZERO;cv2.THRESH_TOZERO_INV.
- Block Size: 图片中分块的大小
- C :阈值计算方法中的常数项
实现
ret, th1 = cv2.threshold(img_gray, 150, 255, cv2.THRESH_BINARY)
th2 = cv2.adaptiveThreshold(img_gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 9, 12)
th3 = cv2.adaptiveThreshold(img_gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 9, 12)
plt.figure(figsize=(8, 8))
plt.subplot(221), plt.imshow(img_convert(ori_img), cmap='gray'), plt.title('original_img')
plt.subplot(222), plt.imshow(img_convert(th1), cmap='gray'), plt.title('th_binary')
plt.subplot(223), plt.imshow(img_convert(th2), cmap='gray'), plt.title('mean')
plt.subplot(224), plt.imshow(img_convert(th3), cmap='gray'), plt.title('gauss')
plt.show()