3.1.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_INV5.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 thresholdingblur = 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.rhkb.cn/news/152747.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

unity使用UniStorm 5.1.0.unitypackage增加天气

添加天天气组件unistorm 然后添加一个player 导入包会报错,需要修改代码 using UnityEngine; using UnityEngine.PostProcessing;namespace UnityEditor.PostProcessing {[CustomPropertyDrawer(typeof(UnityEngine.PostProcessing.MinAttribute))]sealed class MinDrawer : …

Transformer预测 | Python实现基于Transformer的股票价格预测(tensorflow)

文章目录 效果一览文章概述程序设计参考资料效果一览 文章概述 Transformer预测 | Python实现基于Transformer的股票价格预测(tensorflow) 程序设计 import numpy as np import matplotlib.pyplot

【多线程案例】设计模式-单例模式

1.单例模式 什么是单例模式? 所谓单例,即单个实例。通过编码技巧约定某个类只能有唯一一个实例对象,并且提前在类里面创建好一个实例对象,把构造方法私有化,再对外提供获取这个实例对象的方法,&#xff0…

lua 中文字符的判断简介

一般在工作中会遇到中文字符的判断、截断、打码等需求,之前一直没有总结,虽然网上资料也多,今天在这里简单的总结一下。 1 .UTF-8简单描述 UTF-8 是 Unicode 的实现方式之一,其对应关系(编码规则)如下表所…

九大高效的前端测试工具与框架

前言: 在每个Web应用程序中,作为用户直接可见的应用程序外观,“前端”包括:图形化的用户界面、相应的功能、及其整体站点的可用性。我们可以毫不夸张地说:如果前端无法正常工作,您将无法“拉新”网站的潜在…

OpenCV4(C++)—— 仿射变换、透射变换和极坐标变换

文章目录 一、仿射变换1. getRotationMatrix2D()2. warpAffine() 二、透射变换三、极坐标变换 一、仿射变换 在OpenCV中没有专门用于图像旋转的函数,而是通过图像的仿射变换实现图像的旋转。实现图像的旋转首先需要确定旋转角度和旋转中心,之后确定旋转…

js高级(代理,浅拷贝深拷贝,节流和防抖,闭包.hasOwnProperty)

1.代理 1.问题:如何定义一个对象,不会被修改,也不能被遍历? 通过Object.defineProperty(对象,属性名,option)定义默认属性 无法被修改无法被删除无法被遍历 注意:Object.Property传入的值与返回的值是同一个地址 可以配置一下属性 value:初始值writable:true (true允许被修改…

MM-Camera架构-Preview 流程分析

目录 文章目录 1 log开的好,问题都能搞2 lib3 preview3.1 打开视频流3.1.1 cpp\_module\_start\_session3.1.2 cpp\_thread\_create3.1.3 cpp\_thread\_funcsundp-3.1 cpp\_hardware\_open\_subdev(ctrl->cpphw)sundp-3.2 cpp\_hardware\_process\_command(ctrl-…

JIRA 如何在项目之间移动 Issue

需要使用 JIRA 的查找功能。 把需要移动的 Issue 先全部找到,然后选择 Tools 下面的所有 Issues 批量操作页面 在随后的页面中,将会出现批量操作的页面。 在这里,可以对需要进行批量操作的问题,进行全部选择。 然后单击下一步继…

RunnerGo亮相QECon大会上海站,来看看这款全栈测试平台

QECon(Quality Efficiency Conference)质量效能大会在上海正式开幕!本次大会以"数生智慧:高质量发展新引擎"为主题,深入探讨如何借助数字化和智能化技术推动软件质量的发展,为高质量经济发展提供…

分类预测 | MATLAB实现KOA-CNN-BiLSTM开普勒算法优化卷积双向长短期记忆神经网络数据分类预测

分类预测 | MATLAB实现KOA-CNN-BiLSTM开普勒算法优化卷积双向长短期记忆神经网络数据分类预测 目录 分类预测 | MATLAB实现KOA-CNN-BiLSTM开普勒算法优化卷积双向长短期记忆神经网络数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.MATLAB实现KOA-CNN-BiLST…

Windows安装人大金仓数据库问题解决

一、安装包、授权文件下载 官网下载windows对应的安装包 下载授权文件 二、安装 (1)将下载的授权文件包解压待用 (2)将下载好的.iso安装程序解压,使用管理员身份运行安装程序,一路下一步,直…

SpringBoot的流浪宠物系统

采用技术:springbootvue 项目可以完美运行

电动机监控系统在企业降碳过程中的作用-安科瑞黄安南

1.前言 据《2017-2022年中国电力工业产业专项调查及十三五市场商机分析报告》显示,从我国目前全社会用电结构来看,工商业用户耗电量约占 80%,其中电机耗电约占工业用电的 75%,全国总耗电的 60%,是用户终端耗电占比较大…

2023 IDC中国数字金融论坛丨中电金信向行业分享“源启+应用重构”新范式

9月8日,IDC主办的“2023 IDC中国数字金融论坛”在北京召开。中电金信受邀参会,并带来了深度数字化转型趋势之下关于应用重构的分享与洞见。 论坛重点关注金融科技创新发展趋势与数字化转型之路,中电金信副总经理、研究院院长况文川带来了“创…

“揭秘淘宝店铺所有商品接口:一键获取海量热销宝贝信息!“

淘宝店铺所有商品接口可以通过shop id或店铺主链接获取到整店商品,数据包括:商品ID,图片地址,店铺标题,优惠价,价格,销量,宝贝链接等整个店铺的商品。 要使用这个接口,需…

4.物联网射频识别,RFID开发【智能门禁项目】

补充:学习路径 一。项目介绍及需求分析 1.酒店智能门禁使用场景介绍 1.客人入住 客人在前台办理入住手续,前台管理员通过门禁管理系统为客户开一张门禁卡 客户持卡到相应客房,用IC 卡刷卡开门 客人过了入住时间后,卡自动失效&a…

【简单的留言墙】HTML+CSS+JavaScript

目标&#xff1a;做一个简单的留言墙 1.首先我们用HTML的一些标签&#xff0c;初步构造区域 样式。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>留言墙</title><style>/* ...... */ …

Charles:移动端抓包 / windows客户端 iOS手机 / 手机访问PC本地项目做调试

一、背景描述 1.1、本文需求&#xff1a;移动端进行抓包调试 1.2、理解Charles可以做什么 Charles是一款跨平台的网络代理软件&#xff0c;可以用于捕获和分析网络流量&#xff0c;对HTTP、HTTPS、HTTP/2等协议进行调试和监控。使用Charles可以帮助开发人员进行Web开发、调试…

pytorch_神经网络构建2(数学原理)

文章目录 深层神经网络多分类深层网络反向传播算法优化算法动量算法Adam 算法 深层神经网络 分类基础理论: 交叉熵是信息论中用来衡量两个分布相似性的一种量化方式 之前讲述二分类的loss函数时我们使用公式-(y*log(y_)(1-y)*log(1-y_)进行误差计算 y表示真实值,y_表示预测值 …