[图像增强][灰度变换]4. 二值化

2021-11-08  本文已影响0人  砥砺前行的人

1. 基本原理

二值化,属于非线性变换,变换关系可如下:


简单二值化

\begin{equation} f(x)=\left\{ \begin{array}{rcl} 0 & & { x \leq T} \\ 255 & & { x > T} \end{array} \right. \end{equation}

多段二值化

\begin{equation} f(x)=\left\{ \begin{array}{rcl} 0 & & { x \leq T_1} \\ 255 & & { T_2 > x > T_1} \\ 0 & & { T_2 \leq x } \\ \end{array} \right. \end{equation}

使用二值化,最大的难点是确定阈值,例如想要通过阈值突出ROI,则需要确定一个合适的阈值,将其他区域变黑或者变白,使ROI的轮廓可以更清晰。而二值化本身并不难理解。

2. 使用场景

突出 ROI。

3. 代码示例

考虑如下灰度图像:


代码如下:

import cv2 as cv
import numpy as np
from math import *
import matplotlib.pyplot as plt


# 按灰度读取一张图片
img = cv.imread("dog.jpeg",cv.IMREAD_GRAYSCALE)
ret,img = cv.threshold(img,255,255,cv.THRESH_TRUNC)
ret,thresh1 = cv.threshold(img,140,255,cv.THRESH_BINARY)
ret,thresh2 = cv.threshold(img,140,255,cv.THRESH_BINARY_INV)
ret,thresh3 = cv.threshold(img,140,255,cv.THRESH_TRUNC)
ret,thresh4 = cv.threshold(img,140,255,cv.THRESH_TOZERO)
ret,thresh5 = cv.threshold(img,140,255,cv.THRESH_TOZERO_INV)
titles = ['img','BINARY','BINARY_INV','TRUNC','TOZERO','TOZERO_INV']
images = [img,thresh1,thresh2,thresh3,thresh4,thresh5]
for i in range(6):
    plt.subplot(2,3,i+1),plt.imshow(images[i],'gray')
    plt.title(titles[i])
    plt.xticks([]),plt.yticks([])
plt.show()

输出结果如下:


结果图

各种 flag 关系图如下:


关系图
Flag 描述
THRESH_BINARY 低于阈值设置为0,高于则设置为maxValue
THRESH_BINARY_INV 低于阈值设置为 maxValue,高于则设置为 0
THRESH_TRUNC 高于阈值则设定为指定值
THRESH_TOZERO 低于阈值则设置为0
THRESH_TOZERO_INV 高于阈值则设置为0
上一篇下一篇

猜你喜欢

热点阅读