opencv 二值化_Python-OpenCV获取图像轮廓的图像处理方法

一、引言

在《OpenCV阈值处理函数threshold处理32位彩色图像的案例》介绍了threshold 函数,但threshold 的图像阈值处理对于某些光照不均的图像,这种全局阈值分割的方法并不能得到好的效果。

图像阈值化操作中,我们更关心的是从二值化图像中分离目标区域和背景区域,仅仅通过固定阈值很难达到理想的分割效果。在图片中的灰度是不均匀的,所以通常情况下图片中不同区域的阈值是不一样的。这样就需要一种方法根据图像不同区域亮度或灰度分布,计算其局部阈值来进行阈值处理。这种方法就是自适应阈值化图像处理,实际上这可以称为局部阈值法,在OpenCV中的adaptiveThreshold就是这种方法。

二、adaptiveThreshold语法介绍

调用语法:
adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C, dst=None)

说明:

  • src:源图像,必须是8位的灰度图
  • dst:处理后的目标图像,大小和类型与源图像相同
  • maxValue:用于指定满足条件的像素设定的灰度值
  • adaptiveMethod:使用的自适应阈值算法,有2种类型ADAPTIVE_THRESH_MEAN_C算法(局部邻域块均值)或ADAPTIVE_THRESH_GAUSSIAN_C(局部邻域块高斯加权和),ADAPTIVE_THRESH_MEAN_C的计算方法是计算出邻域的平均值再减去第六个参数C的值,ADAPTIVE_THRESH_GAUSSIAN_C的计算方法是计算出邻域的高斯均匀值再减去第六个参数C的值。处理边界时使用BORDER_REPLICATE | BORDER_ISOLATED模式
  • thresholdType:阈值类型,只能是THRESH_BINARY或THRESH_BINARY_INV二者之一,具体参考上面“图像阈值处理”的表格
  • blockSize:表示邻域块大小,用来计算区域阈值,一般选择3、5、7……
  • C:表示常数,它是一个从均匀或加权均值提取的常数,通常为正数,但也可以是负数或零
  • 返回值:处理后的图像

三、补充说明

  1. 亮度较高的图像区域的二值化阈值通常会较高,而亮度较低的图像区域的二值化阈值则会相适应地变小
  2. 在灰度图像中,灰度值变化明显的区域往往是物体的轮廓,所以将图像分成一小块一小块的去计算阈值往往会得出图像的轮廓。因此函数adaptiveThreshold除了将灰度图像二值化,也可以进行边缘提取
  3. 之所以能进行边缘提取,是因为当block很小时,如block_size=3 or 5 or 7时,“自适应”的程度很高,即容易出现block里面的像素值都差不多,这样便无法二值化,而只能在边缘等梯度大的地方实现二值化,结果显得它是边缘提取函数
  4. 当把blockSize设为比较大的值时,如blockSize=21 or 31 or 41时,adaptiveThreshold便是二值化函数
  5. blockSize必须为大于1的奇数(原理老猿还没弄清楚) ,
  6. 如果使用平均值方法,平均值mean为180,差值delta为10,maxValue设为255。那么灰度小于170的像素为0,大于等于170的像素为255,如果是反向二值化,灰度小于170的像素为255,大于等于170的像素为0

四、案例

import cv2img = cv2.imread(r'F:screenpic1.jpg',cv2.IMREAD_GRAYSCALE)newImg = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY_INV, 3, 5)cv2.imshow('img',img)cv2.imshow('newImg',newImg)cv2.waitKey(60000)

运行效果:
源图:

e4469fbb8dcb63069b0314f75b1737c2.png


下面是分别设置不同blockSize的结果图,左图块大小blockSize为31,右图blockSize为3:

433f617113c02e2858832be8ac88d5fe.png


可以看到blockSize小时,轮廓识别效果明显,而大时,就是一个二值化图像。

关于老猿的付费专栏

老猿的付费专栏《使用PyQt开发图形界面Python应用》专门介绍基于Python的PyQt图形界面开发基础教程,付费专栏《moviepy音视频开发专栏》详细介绍moviepy音视频剪辑合成处理的类相关方法及使用相关方法进行相关剪辑合成场景的处理,两个专栏加起来只需要19.9元,都适合有一定Python基础但无相关专利知识的小白读者学习。这2个收费专栏都有对应免费专栏,只是收费专栏的文章介绍更具体、内容更深入、案例更多。

付费专栏文章目录:《moviepy音视频开发专栏文章目录》、《使用PyQt开发图形界面Python应用专栏目录》。

关于Moviepy音视频开发的内容,请大家参考《Python音视频剪辑库MoviePy1.0.3中文教程导览及可执行工具下载》的导览式介绍。

对于缺乏Python基础的同仁,可以通过老猿的免费专栏《专栏:Python基础教程目录》从零开始学习Python。

如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。

4bc556a4df8ecd366dded9aa1659b578.png

本文在CSDN的“老猿Python”首发,头条号、微信公众号和百家号“老猿Python”转载,由于这些平台对外部链接的限制,文中不能包含外部链接。如果是头条请点击文章底部最下方的“了解更多”跳转CSDN阅读原文,如果是微信公众号请点击文章底部最下方的“阅读原文”跳转CSDN阅读原文,否则请在百度搜索或CSDN搜索中输入"CSDN老猿Python”加文章标题关键字搜寻本文

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/468124.shtml

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

相关文章

让你不再害怕指针.pdf

今天推荐一本书,是讲解指针的,C 语言理解指针应该算一个重点,也算是一个难点,这个pdf 文章总结非常好,推荐给大家。想获取书籍Pdf的同学,请在公众号后台回复 「指针」,希望这本书籍让你们不再害…

revit如何根据坐标进行画线_在工程设计中如何根据工艺阀门的结构与特点来进行设计呢?...

在工程设计的实践中发现,因为阀门的种类繁多,每种阀门都有自己的特点,工程设计人员,尤其年轻的设计者由于不太了解阀门的结构和特点往往选错阀门,造成设计失误。系统的了解阀门,对工程设计人员(不是阀门设计…

c语言中二维数组中产生随机数,C语言中是如何进行随机数生成的[多图]

C语言中是如何进行随机数生成的.C语言是编程人员经常会到的一款计算机编程语言,有的朋友想知道怎样使用C语言进行随机数生成,那么就快随小编一起来看看这篇C语言中是如何进行随机数生成的吧!其中不仅为大家介绍了生成随机数的函数,还提供了测试代码!同时为大家附带了随机数字生…

一文带你了解V4L2

1、什么是v4l2V4L2(Video4Linux的缩写)是Linux下关于视频采集相关设备的驱动框架,为驱动和应用程序提供了一套统一的接口规范。V4L2支持的设备十分广泛,但是其中只有很少一部分在本质上是真正的视频设备:•Video captu…

Linux 僵尸进程可以被杀死吗?

在 Unix 进程模型中,父进程和其所产生的子进程是异步运行的,所以如果子进程在结束后,会留下一些信息需要父进程使用 wait / waitpid 来接收。而如果父进程太忙了,没有调用 wait / waitpid 的话,子进程就会变成…

jstl 获取 javascript 定义的变量_前端开发大牛完整总结出了JavaScript 难点 +最新web前端开发教程...

1. 立即执行函数立即执行函数,即Immediately Invoked Function Expression (IIFE),正如它的名字,就是创建函数的同时立即执行。它没有绑定任何事件,也无需等待任何异步操作:立即执行函数function(){…}是一个匿名函数&…

MySQL 5.6.20-enterprise-commercial的参数文件位置问题

今天在折腾MySQL的参数文件时,突然发现MySQL 5.6.20-enterprise-commercial-advanced-log这个版本数据库的参数文件my.cnf的位置有点奇怪,如下所示: [rootDB-Server ~]# mysql --help | grep my.cnforder of preference, my.cnf, $MYSQL_TCP_…

最害怕的是,不知道想要什么

生活在现在的时代,你要是出去吹牛说你与世无争,你看破红尘,你就想开心上班啥也不图,别人要不以为你是一个傻子,要不就以为你是一个家财万贯的主,特别是现在,从2015年开始,房价像吃了…

c语言gcc汇编文件,[汇编]gcc生成汇编.s文件 $ gcc -Og -S sum.c /$ gcc -Og -S -masm=intel sum.c 与 反汇编 objdump...

目录- C语言源码文件:sum.c- gcc 生成的汇编语言文件 sum.sx86-64 AT&T 语法格式x86-64 Intel格式- 反汇编 objdump3.1 输出 AT&T格式 objdump -d sum3.2 输出 Intel格式 objdump -M intel -d sumC语言源码文件:sum.c加法:c a b#in…

diff算法_详解 React 16 的 Diff 策略

这是我 Deep In React 系列的第二篇文章,如果还没有读过的强烈建议你先读前一篇:详谈 React Fiber 架构(1)。前言我相信在看这篇文章的读者一般都已经了解过 React 16 以前的 Diff 算法了,这个算法也算是 React 跨时代或者说最有影响力的一点…

实力剖析一个经典笔试题

昨天群里有个同学发了这样一个题目过来&#xff0c;这个题目应该是嵌入式笔试经典题目了&#xff0c;如果是校招的话&#xff0c;笔试不考这个题目&#xff0c;都觉得有点说不过去。#include <stdio.h>int main() {int a[5] {1,2,3,4,5};int *ptr1 (int *)(&a 1);i…

点击开启此虚拟机时,出现“该虚拟机似乎正在使用中”问题

VMware是常用的虚拟机工具&#xff0c;受到广大群众的喜爱&#xff0c;有用户在意外断电或非正常关机&#xff08;直接关掉进程&#xff09;出现VMware虚拟机无法启动的情况&#xff0c;接下来让我们看看如何解决这一问题。 1.点击我的计算机的windows 10*64后弹出对话框&#…

get请求可以传body吗_都9102年了,GET和POST的区别掌握了没有?

1 前言最近看了一些同学的面经&#xff0c;发现无论什么技术岗位&#xff0c;还是会问到 get 和 post 的区别&#xff0c;而搜索出来的答案并不能让我们装得一手好逼&#xff0c;那就让我们从 HTTP 报文的角度来撸一波&#xff0c;从而搞明白他们的区别。2 标准答案在开撸之前吗…

玩转 Rockchip 的开发板,这些信息你要知道

RK 的处理器Rockchip 在江湖中简称 RK&#xff0c;是一家总部坐落于福建福州的 SOC 设计公司。RK 基于 Arm cortex-A 内核设计的一系列 SOC &#xff0c;宛如苍穹中一颗颗明星&#xff0c;在国内外的产业界和极客手中闪闪发光&#xff0c;其受欢迎程度超过了很多人的想象。登录…

htmlcss实例小项目_小程序websocket心跳库——websocket-heartbeat-miniprogram

前言在16年的时候因为项目接触到websocket&#xff0c;而后对心跳重连做了一次总结&#xff0c;写了篇博客&#xff0c;而后18年对之前github上的demo代码进行了再次开发和开源&#xff0c;最终封装成库。如下&#xff1a;博客&#xff1a;https://www.cnblogs.com/1wen/p/5808…

C语言,画吃豆人剖析

接上一篇文章&#xff0c;很多人还是搞不清楚ptr1[-1]是怎么回事&#xff0c;可以看看这篇文章&#xff0c;看完的同学还是多转发的&#xff0c;让更多的人看到。一道90%都会做错的指针题偶然的一次机会在知乎上看到这个代码&#xff0c;里面涉及的C语言点我觉得很酷&#xff0…

mit数据集_DriveSeg:动态驾驶场景分割数据集

【导读】麻省理工学院和丰田发布DriveSeg数据集以加速自动驾驶研究&#xff0c;DriveSeg包含许多常见道路对象的精确像素级表示&#xff0c;并通过连续视频驾驶场景的镜头。我们如何训练自动驾驶模型&#xff0c;以加深对周围世界的认识&#xff1f;计算机能否从过去的经验中学…

没有长夜痛哭的人,不足以谈人生

早上骑电动车上班了&#xff0c;之前已经连续开车上班有一段时间&#xff0c;每天出公司交停车费心都在滴血&#xff0c;活了30年了&#xff0c;想不到我还是这样穷&#xff0c;我总是觉得明天是最好的一天&#xff0c;即使过得不是十分如意&#xff0c;但是我遇到困难的时候总…

android ne调试工具,Android调试工具adb的正确使用方式

引言&#xff1a;通常在使用Eclipse进行Android应用开发的时候&#xff0c;我们可以使用Eclipse自带的工具来完成调试和查看输出日志的操作&#xff0c;但是假如在当前电脑并没有配置适用于Android开发的Eclipse版本的情况下&#xff0c;想要查看Android设备运行应用或者游戏时…

为什么使用模板

C模板编程是泛型编程的实现方式&#xff0c;因为C中的类型都是强类型。所以导致每个变量都有一种相应的类型。这样就会出现一个弊端&#xff0c;就是相同一个算法针对不同类型的參数&#xff0c;就要实现多个版本号&#xff0c;这样岂不是非常麻烦。那么&#xff0c;C中是否会有…