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

news2025/1/12 13:49:20

文章目录

  • 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.coloradmin.cn/o/1067635.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

指针拔尖1——(看完包会,不会来打我)

文章目录 前言:本章节涵盖——一、指针变量基础二、字符指针三、指针数组和数组指针拓展:数组名和&数组名的区别四、 指针传参总结 前言:本章节涵盖—— 1.指针变量基础知识 2.字符指针 3.数组指针 4.指针数组 5.指针传参 一、指针变量基…

I/O多路复用【Linux/网络】(C++实现select、poll和epoll服务器)

阅读前导: “I/O 多路复用”处于知识树中网络和操作系统的最后,因此本文默认读者有计算机网络和操作系统的基础。 1. 引入:C10K 问题 c10k 问题是指如何让一个服务器同时处理超过 10000 个客户端的连接,这是一个网络编程中的经…

人机环境系统智能需要新的逻辑和数学体系

人机环境系统智能需要一个新的逻辑体系,以应对复杂多变、高度动态和不确定性的实际应用场景。 传统逻辑体系主要基于精确的符号逻辑和精确的数学方法,适用于精确的、确定性的问题。但在人机环境系统智能领域,问题往往是复杂的、动态的&#x…

体验华为云CodeArts Check IDE插件国际化展示效果

作者: yd_257945187 原文链接:体验CodeArts Check IDE插件国际化展示效果-云社区-华为云 开发者自述 俗话说“工欲善其事,必先利其器”,把自己的IDE配置的即逼格又好看,是每个程序员的梦想!IDE插件亦是如…

Leetcode hot 100之二叉树

目录 (反)序列化二叉树&#xff08;str<->tree&#xff09;&#xff1a;前序 前序遍历&#xff08;迭代&#xff09;/路径 stack.length 入栈&#xff1a;中右左 出栈&#xff1a;中左右 中序遍历&#xff08;迭代&#xff09; cur||stack.length 后序遍历&#x…

机器视觉工程师,公司设置奖金,真的为了奖励你吗?其实和你没关系

​据说某家大厂&#xff0c;超额罚款&#xff0c;有奖有罚很正常&#xff0c;但是我觉得你罚款代理商员工就不一样了&#xff0c;把代理商当成你的员工&#xff0c;我就觉得这些大厂的脑回路有问题。 有人从来没听说过项目奖金&#xff0c;更没有奖金。那么为什么设置奖金呢&a…

开源大模型正在“杀死”闭源?

点击关注 文丨郝 鑫&#xff0c;编丨刘雨琦 “OpenAI不足为惧&#xff0c;开源会慢慢赶上来。” 彼时Hugging Face创始人Clem Delangue的一句预言&#xff0c;正在迅速成为现实。 ChatGPT横空出世7个多月后&#xff0c;7月19日&#xff0c;Llama 2宣布开源&#xff0c;并且可…

OpenCV实现求解单目相机位姿

单目相机通过对极约束来求解相机运动的位姿。参考了ORBSLAM中单目实现的代码&#xff0c;这里用opencv来实现最简单的位姿估计. mLeftImg cv::imread(lImg, cv::IMREAD_GRAYSCALE); mRightImg cv::imread(rImg, cv::IMREAD_GRAYSCALE); cv::Ptr<ORB> OrbLeftExtractor …

No169.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

Neo4j深度学习

Neo4j的简介 Neo4j是用Java实现的开源NoSQL图数据库。从2003年开始开发&#xff0c;2007年正式发布第一版&#xff0c;其源码托管于GitHtb。Neo4j作为图数据库中的代表产品&#xff0c;已经在众多的行业项目中进行了应用&#xff0c;如&#xff1a;网络管理、软件分析、组织和…

Android Camera FW 里的requestId和frameId

安卓相机frameworks里面经常出现requestId和frameId&#xff0c;最近简单看了一下代码&#xff0c;发现相关流程还是很复杂的&#xff0c;总结来看requestId 就是上层&#xff08;java&#xff09;发送的repeating(capture)请求的id&#xff0c;是从0开始递增的。 这是CameraD…

Linux基本指令(下)——“Linux”

各位CSDN的uu们好呀&#xff0c;今天&#xff0c;小雅兰的内容仍然是Linux中的基本指令啦&#xff0c;下面&#xff0c;让我们进入Linux的世界吧&#xff01;&#xff01;&#xff01; Cal指令 find指令&#xff1a;&#xff08;灰常重要&#xff09; -name grep指令 zip/un…

论文阅读--Cell-free massive MIMO versus small cells

无蜂窝大规模MIMO与小蜂窝网络 论文信息 Ngo H Q, Ashikhmin A, Yang H, et al. Cell-free massive MIMO versus small cells[J]. IEEE Transactions on Wireless Communications, 2017, 16(3): 1834-1850. 无蜂窝大规模MIMO中没有小区或者小区边界的界定&#xff0c;所有接入…

2023Node.js零基础教程(小白友好型),nodejs新手到高手,(二)NodeJS入门——buffer模块、计算机基础、fs模块、path模块

就算步子乱了又如何&#xff0c;接着跳下去就好了。——《闻香识女人》 开始 011_Buffer_介绍与创建 hello&#xff0c;大家好&#xff0c;我们来学习一下buffer。首先来看看 buffer 是一个什么东东。buffer&#xff0c;中文译为缓冲区&#xff0c;是一个类似于数组的对象&am…

关于分布式操作系统

关于分布式操作系统&#xff0c;如果你不太理解的话&#xff0c;可以把它看成是传统操作系统延展。二者的区别在于&#xff0c;传统的操作系统都是单机系统&#xff0c;只能在一台计算机上运行&#xff0c;而分布式操作系统是多机系统&#xff0c;每台计算机都是系统中的一个计…

从抽象类和普通类的区别中体会设计模式

普通类可以实例化&#xff0c;抽象类型只能去继承&#xff0c;抽象类用于定义一些基本的行为和属性&#xff0c;具体的行为由子类去完成。我们先来看下下边的代码&#xff1a; 我们也来顺便总结一下普通类和抽象类的区别&#xff1a; 实例化&#xff1a;普通类可以直接实例化&…

架构师选择题--信息安全技术(系统安全)

架构师选择题--信息安全技术 真题 很少超纲 真题 b c d d b a d a d a Kergberos和数字证书是类似的协议 向TGS申请票据 C PGP&#xff1a;安全电子邮件传输协议 b c b 使用发送方是私钥加密摘要–发送方不可抵赖 加密&#xff1a;保密性 信息摘要&#xff1a;完整性 数…

(面试)谈谈我对C++面向对象特性的理解

&#x1f4af; 博客内容&#xff1a;C读取一行内个数不定的整数的方式 &#x1f600; 作  者&#xff1a;陈大大陈 &#x1f680; 个人简介&#xff1a;一个正在努力学技术的准前端&#xff0c;专注基础和实战分享 &#xff0c;欢迎私信&#xff01; &#x1f496; 欢迎大家&…

等精度频率计verilog,quartus仿真视频,原理图,代码

名称&#xff1a;等精度频率计设计verilog quartus仿真 软件&#xff1a;Quartus 语言&#xff1a;Verilog 要求&#xff1a; A&#xff1a;测量范围信号:方波 频率:100Hz~1MHz; B&#xff1a;测试误差:<0.1%(全量程) C&#xff1a;时钟频率:50kHz D&#xff1a;预闸…

UniApp项目实践HelloUni

效果镇楼 书接上文&#xff0c;继续写入内容&#xff1b;哪怕一句话代码呢&#xff0c;今天的一小步&#xff0c;将来的一大步 <template><div class"box"><h1>uniapp <span class"row">零基础</span>入门和快速进阶课程&l…