OpenCV图像处理—-图像的二值化

图像二值化( Image Binarization) 就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果的过程。

二值化的原理

import cv2

img = cv2.imread('img/lena.jpg')

new_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
height, width = new_img.shape[0:2]

thresh = 60

for row in range(height):
    for col in range(width):

        gray = new_img[row, col]

        if gray > thresh:
            new_img[row, col] = 255

        elif gray < thresh:
            new_img[row, col] = 0

cv2.imshow('img', new_img)
cv2.waitKey()

OpenCV图像处理----图像的二值化

OpenCV提供的图像二值化API

threshold()&#x65B9;&#x6CD5;&#x53C2;&#x6570;&#xFF1A;

  1. 图片矩阵
  2. 阈值
  3. 图片中的最大值
  4. 二值化的方式

二值化的方式:

THRESH_BINARY高于阈值改为255,低于阈值改为0THRESH_BINARY_INV高于阈值改为0,低于阈值改为255THRESH_TRUNC截断,高于阈值改为阈值,最大值失效THRESH_TOZERO高于阈值不改变,低于阈值改为0THRESH_TOZERO_INV高于阈值该为0,低于阈值不改变

import cv2

img = cv2.imread('img/lena.jpg', cv2.IMREAD_GRAYSCALE)

thresh, new_img = cv2.threshold(img, 60, 255, cv2.THRESH_BINARY)

print(thresh)
cv2.imshow('img', img)
cv2.imshow('NEW_IMG', new_img)
cv2.waitKey()

OpenCV图像处理----图像的二值化

自适应阈值

使用一个全局值作为阈值。但是在所有情况下这可能都不太好。如果图像在不同区域具有不同的照明条件。在这种情况下,自适应阈值阈值可以帮助。这里,算法基于其周围的小区域确定像素的阈值。因此,我们为同一图像的不同区域获得不同的阈值,这为具有不同照明的图像提供了更好的结果。

adaptlive()&#x65B9;&#x6CD5;&#x53C2;&#x6570;&#xFF1A;

  1. 图片矩阵
  2. 图片灰度最大值
  3. 计算阈值的方法
  4. 阈值类型
  5. 处理块大小
  6. 算法所用的常量C

  7. cv2.ADAPTIVE_THRESH_MEAN_C:该阈值是该附近区域减去恒定的平均Ç。

  8. cv2.ADAPTIVE_THRESH_GAUSSIAN_C:阈值是邻域值减去常数C的高斯加权和。
import cv2

img = cv2.imread('img/lena.jpg', cv2.IMREAD_GRAYSCALE)

thresh_img = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 5)

cv2.imshow('thresh_img', thresh_img)
cv2.waitKey()

OpenCV图像处理----图像的二值化

大津算法(最大类间方差法)

&#x56FE;&#x50CF;&#x5206;&#x5272;&#x4E2D;&#x9608;&#x503C;&#x9009;&#x53D6;&#x7684;&#x6700;&#x4F73;&#x7B97;&#x6CD5;

threshold(gaussian_img, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)

import cv2

img = cv2.imread('img/lena.jpg', cv2.IMREAD_GRAYSCALE)

ret, thresh_img = cv2.threshold(img, 255, 255, cv2.THRESH_BINARY)
cv2.imshow('normal', thresh_img)

gaussian_img = cv2.GaussianBlur(img, (5, 5), 0)
cv2.imshow('gaussian_img', gaussian_img)

ret, thresh_img = cv2.threshold(gaussian_img, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)

cv2.imshow('otsu', thresh_img)

cv2.imshow('img', img)
cv2.waitKey()

原图:

OpenCV图像处理----图像的二值化

使用255的阈值进行二值化 图片全黑了:

OpenCV图像处理----图像的二值化

使用高斯滤波模糊图像:

  1. 图片矩阵
  2. 卷积核
  3. 越大越模糊

OpenCV图像处理----图像的二值化

使用0阈值的大津算法二值化经过高斯滤波模糊后的图像:

OpenCV图像处理----图像的二值化

Original: https://blog.csdn.net/bjsyc123456/article/details/124781982
Author: B.Bz
Title: OpenCV图像处理—-图像的二值化

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/518145/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球