3.1.OpenCV技能树--二值图像处理--阈值

news/2024/7/21 7:12:47 标签: opencv, 图像处理, 人工智能

文章目录

  • 1.文章内容来源
  • 2.阈值分割
    • 2.1.简单阈值分割
      • 2.1.1.简单阈值分割原理介绍
      • 2.1.2.简单阈值分割核心代码
      • 2.1.3.简单阈值分割效果展示
    • 2.2.自适应阈值分割
      • 2.2.1.自适应阈值分割原理介绍
      • 2.2.2.自适应阈值分割核心代码
      • 2.2.3.自适应阈值分割效果展示
    • 2.3.Otsu’s二值化/大津阈值分割法
      • 2.3.1.大津阈值分割法原理介绍
      • 2.3.2.大津阈值分割法核心代码
      • 2.3.3.大津阈值分割法效果展示
  • 3.课后习题代码复现
    • 3.1.课后习题题目展示
    • 3.2.课后习题解决方法
      • 3.2.1.课后习题解决方法1
      • 3.2.2.课后习题解决方法2

1.文章内容来源

1.题目来源:https://edu.csdn.net/skill/practice/opencv-b77391c3fa5648f4bb92e990d6cf1922/8310?typeId=20781&language=opencv&materialId=20780
2.资料来源:https://edu.csdn.net/skill/opencv/opencv-b77391c3fa5648f4bb92e990d6cf1922?category=658&typeId=20780

2.阈值分割

2.1.简单阈值分割

2.1.1.简单阈值分割原理介绍

简单阈值分割原理:
人如其名,简单阈值分割的特点就是简单.
其原理就是我们设置一个阈值T,作为简单阈值分割的判断阈值。
如果像素值大于T,我们就将其设置为一个新的恒定值T_high(一般为255)
如果像素值小于T,我们就将其设置为一个新的恒定值T_low(一般为0)
所以简单阈值化之的图片的像素值值只有两种取值

函数解析:
cv2.threshold (src, thresh, maxval, type)
1.src:原图片
2.thresh阈值(0-255)
3.maxval:填充色,T_high(0-255)
4.Type:阈值类型

阈值类型
1.cv2.THRESH_BINARY	二进制阈值化,非黑即白。
2.cv2.THRESH_BINARY_INV	反二进制阈值化,非白即黑。
3.cv2.THRESH_TRUNC	截断阈值化,大于阈值设为阈值。
4.cv2.THRESH_TOZERO	阈值化为0,小于阈值设为05.cv2.THRESH_TOZERO_INV	反阈值化为0,大于阈值设为0

2.1.2.简单阈值分割核心代码

import cv2
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.image as mpimg    #mpimg读取图片

img=cv2.imread(r'D:\HuaweiMoveData\Users\27182\Desktop\opencv\3.Binary image processing\lena.png',0)#必须为灰度图,单通道
#
ret,thresh1=cv2.threshold(img,127,255,cv2.THRESH_BINARY)
ret,thresh2=cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV)
ret,thresh3=cv2.threshold(img,127,255,cv2.THRESH_TRUNC)
ret,thresh4=cv2.threshold(img,127,255,cv2.THRESH_TOZERO)
ret,thresh5=cv2.threshold(img,127,255,cv2.THRESH_TOZERO_INV)
#
images = [img, thresh1, thresh2, thresh3, thresh4, thresh5]
titles = ['Original Image','BINARY','BINARY_INV','TRUNC','TOZERO','TOZERO_INV']
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()

2.1.3.简单阈值分割效果展示

在这里插入图片描述

2.2.自适应阈值分割

自适应阈值分割我有详细介绍的文章:https://blog.csdn.net/m0_71819746/article/details/133551187?spm=1001.2014.3001.5502
大家感兴趣可以去看看

2.2.1.自适应阈值分割原理介绍

自适应阈值分割原理介绍:
简单阈值算法使用全局阈值,但一副图像中不同位置的光照情况可能不同,全局阈值会失去很多信息。这种情况下我们需要采用自适应阈值。
自适应阈值二值化函数根据图片一小块区域的值来计算对应区域的阈值,从而得到也许更为合

dst = cv2.adaptiveThreshold(src, maxval, thresh_type, type, Block Size, C)
      1.src:原图像,就是你需要进行自适应阈值分割处理的图像
      2.maxValue:最大像素点,其含义表示如果某点的像素值大于对应的阈值,那么将像素值取为255.
      3.adaptiveMethod:计算阈值的方法,Opencv中包括了两种:1.cv.ADAPTIVE_THRESH_MEAN_C:计算出领域的平均值作为阈值。
                                                       2.DAPTIVE_THRESH_GAUSSIAN_C:计算出领域的高斯均值作为阈值。
      4.thresholdType:取值类型,只有两个取值:1.THRESH_BINARY   2.THRESH_BINARY_INV
      5.blockSize:计算单位是像素的邻域块大小选择,这是局部邻域大小,只能取奇数,3/5/7/9/116.C:阈值偏移量,正负数都可以,所以阈值的大小=C+adaptiveMethod计算出的阈值值

2.2.2.自适应阈值分割核心代码

import cv2
import numpy as np
from matplotlib import pyplot as plt
# 支持中文
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
def adaptiveThreshold_test():
   img = cv2.imread(r'D:\HuaweiMoveData\Users\27182\Desktop\opencv\3.Binary image processing\lena.png',0)#读入图片
   img = cv2.medianBlur(img, 5)#中值滤波来处理图像
   #图像切割
   #全图像二值化/全局阈值法处理图像
   ret, th1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
   #平均值计算阈值方法(cv2.ADAPTIVE_THRESH_MEAN_C)-偏移值
   th2 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2)
   #高斯值计算阈值方法(cv2.ADAPTIVE_THRESH_GAUSSIAN_C)-偏移值
   th3 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)
   #图像可视化绘制
   titles = [u'原始图像', u'全局阈值处理图像',u'自适应平均阈值处理图像', u'自适应高斯阈值处理图像']
   images = [img, th1, th2, th3]
   for i in range(4):
    plt.subplot(2, 2, i + 1), plt.imshow(images[i], 'gray')
    plt.title(titles[i])
    plt.xticks([]), plt.yticks([])
   plt.show()

if __name__ == '__main__':
  adaptiveThreshold_test()

2.2.3.自适应阈值分割效果展示

在这里插入图片描述

2.3.Otsu’s二值化/大津阈值分割法

2.3.1.大津阈值分割法原理介绍

大津阈值分割法原理介绍:
1.Otsu's二值化是对一副双峰图像自动根据其直方图计算出一个阈值。(对于非双峰图像,这种方法得到的结果可能会不理想)2.这里用到到的函数还是 cv2.threshold(),但是需要多传入一个参数(flag):cv2.THRESH_OTSU。
3.这时要把阈值设为 0。然后算法会找到最优阈值,这个最优阈值就是返回值 retVal。
4.如果不使用Otsu值化,返回的retVal值与设定的阈值相等。

Otsu's算法流程:
1.计算图像直方图;
2.设定一阈值,把直方图强度大于阈值的像素分成一组,把小于阈值的像素分成另外一组;
3.分别计算两组内的偏移数,并把偏移数相加;
4.0~255依照顺序多为阈值,重复1-3的步骤,直到得到最小偏移数,其所对应的值即为结果阈值。

2.3.2.大津阈值分割法核心代码

import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread(r'D:\HuaweiMoveData\Users\27182\Desktop\opencv\3.Binary image processing\lena.png',0)

ret1,th1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)# 全局阈值

ret2,th2 = cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)# Otsu's thresholding

blur = cv2.GaussianBlur(img,(5,5),0)#(5,5)为高斯核的大小, 0 为标准差
ret3,th3 = cv2.threshold(blur,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)#高斯降噪后Otsu’s处理


#绘制图像
images = [img, 0, th1,
        img, 0, th2,
        blur, 0, th3]

titles = ['Original Noisy Image','Histogram','Global Thresholding (v=127)',
        'Original Noisy Image','Histogram',"Otsu's Thresholding",
        'Gaussian filtered Image','Histogram',"Otsu's Thresholding"]

# 这里使用了 pyplot 中画直方图的方法, plt.hist, 要注意的是它的参数是一维数组
# 所以这里使用了(numpy)ravel 方法,将多维数组转换成一维,也可以使用 flatten 方法
#ndarray.flat 1-D iterator over an array.
#ndarray.flatten 1-D array copy of the elements of an array in row-major order.
for i in range(3):
    plt.subplot(3,3,i*3+1),plt.imshow(images[i*3],'gray')
    plt.title(titles[i*3]), plt.xticks([]), plt.yticks([])
    plt.subplot(3,3,i*3+2),plt.hist(images[i*3].ravel(),256)
    plt.title(titles[i*3+1]), plt.xticks([]), plt.yticks([])
    plt.subplot(3,3,i*3+3),plt.imshow(images[i*3+2],'gray')
    plt.title(titles[i*3+2]), plt.xticks([]), plt.yticks([])
plt.show()

2.3.3.大津阈值分割法效果展示

在这里插入图片描述

3.课后习题代码复现

3.1.课后习题题目展示

Question1:
按照颜色对图像进行分类,可以分为彩色图像、灰度图像和二值图像。
灰度图像是只含亮度信息,不含色彩信息的图像。
灰度化处理是把彩色图像转换为灰度图像的过程,是图像处理中的基本操作。
OpenCV 中彩色图像使用 BGR 格式。灰度图像中用 8bit 数字 0255 表示灰度,如:0 表示纯黑,255 表示纯白。
彩色图像进行灰度化处理,可以在读取图像文件时直接读取为灰度图像,也可以通过函数 cv.cvtColor() 将彩色图像转换为灰度图像。
以下图像灰度化程序中,能够正确执行图像灰度化操作的是?

3.2.课后习题解决方法

3.2.1.课后习题解决方法1

#方法1:
#方法一:imread时直接转灰度
import cv2 as cv
if __name__ == '__main__':
    img = cv.imread(r"D:\HuaweiMoveData\Users\27182\Desktop\opencv\3.Binary image processing\lena.png", cv.IMREAD_GRAYSCALE)
    cv.imshow("ImgGray", img)
    key = cv.waitKey(0)

3.2.2.课后习题解决方法2

#%%
#方法二:用cvtColor(src,cv.COLOR_BGR2GRAY)
import cv2 as cv
if __name__ == '__main__':
    img = cv.imread(r"D:\HuaweiMoveData\Users\27182\Desktop\opencv\3.Binary image processing\lena.png")
    imgGray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
    cv.imshow("ImgGray", imgGray)
    key = cv.waitKey(0)

http://www.niftyadmin.cn/n/5071874.html

相关文章

【Axure高保真原型】自适应多行输入框

今天和大家分享自适应多行文本框的原型模板,我们可以在输入框里输入文字,随着文字的数量,输入框的高度也会自动调整……具体效果可以打开下方原型地址体验或者点击下方视频观看 【原型效果】 【Axure高保真原型】自适应多行输入框 【原型预览…

基于STM32设计的智能水产养殖系统(华为云IOT)

一、设计简述 基于STM32设计的智能水产养殖监测系统 1.1 项目背景 随着经济的发展和人口的增长,对水产养殖的需求不断增加。然而,传统的水产养殖方式存在一系列问题,如水质污染、鱼病爆发等。因此,智能化水产养殖技术成为当前热门研究领域。其中,基于物联网技术的智能水产…

一文搞懂UART通信协议

目录 1、UART简介 2、UART特性 3、UART协议帧 3.1、起始位 3.2、数据位 3.3、奇偶校验位 3.4、停止位 4、UART通信步骤 1、UART简介 UART(Universal Asynchronous Receiver/Transmitter,通用异步收发器)是一种双向、串行、异步的通信…

IntelliJ IDEA失焦自动重启服务的解决方法

IDEA 热部署特性 热部署,即应用正属于运行状态时,我们对应用源码进行了修改更新,在不重新启动应用的情况下,可以能够自动的把更新的内容重新进行编译并部署到服务器上,使修改立即生效。 现象 在使用 IntelliJ IDEA运…

AIGC AI绘画 Midjourney 的详细使用手册

Midjourney参数提示与用法。 常见的命令有: --seed:种子值 --q:品质 --c:混乱 --no:负面提示 --iw:权重(0.5-2) ::(多重提示) -- repeat(重复) --stop(停止) --title(无缝贴图:适用于模型版本 1、2、3、5) --video(过程动画,适用于模型版本 1、2…

css记录写一个奇怪的按钮

完成作业的时候发现一个很有意思的按钮&#xff0c;记录一下记录一下 看看界面 可以看出是一个奇形怪状的按钮&#xff0c;而且在按下的时候&#xff0c;图片和文字的颜色会改变 尝试解决 <!DOCTYPE html> <html lang"zh"> <head><meta chars…

最新AI创作系统源码ChatGPT网站源码V2.6.3/支持Midjourney绘画/支持OpenAI GPT全模型+国内AI全模型

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统&#xff0c;支持OpenAI GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作Chat…

Python视频剪辑-Moviepy视频尺寸和颜色调整技巧

在视频编辑中,尺寸和颜色是两个不能忽视的重要因素。本文将从专业角度深入探讨如何通过MoviePy进行视频尺寸和颜色的调整,以及遮罩透明度的应用。 文章目录 视频尺寸变换函数裁剪视频指定区域裁剪视频像素为偶数视频增加边框缩小、放大视频视频颜色变换函数blackwhite 视频变…