十一、图像二值化

一、二值图像

其实就是把图像转换为只有黑白的两种颜色图像,即像素值非零即一

三角阈值二值化

对一个图像进行操作,获取图像的直方图,找到波峰和波谷进行连线设为线段A,每个点做有关线段A的垂线垂足在线段A上,最后将所有的垂足的横坐标累加再加上一个偏量位移得到的值也就是图像的阈值,通过这个阈值对整个图像进行二值化操作。

二、图像二值化的方法

1、全局阈值

OTSU:内方差最小,外方差最大(常用)

import cv2
import numpy as np
from matplotlib import pyplot as pltdef threshold(image):gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)ret,binary = cv2.threshold(gray,0,255,cv2.THRESH_BINARY|cv2.THRESH_OTSU)print("threshold value is:%s"%ret)cv2.imshow("OTSU",binary)src = cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\a1.jpg")
cv2.imshow("image",src)
cv2.namedWindow("image",cv2.WINDOW_AUTOSIZE)threshold(src)cv2.waitKey(0)
cv2.destroyAllWindows()

效果图如下:在这里插入图片描述
在这里插入图片描述

Triangle

import cv2
import numpy as np
from matplotlib import pyplot as pltdef threshold(image):gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)ret,binary = cv2.threshold(gray,0,255,cv2.THRESH_BINARY|cv2.THRESH_TRIANGLE)print("threshold value is:%s"%ret)cv2.imshow("TRIANGLE",binary)src = cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\a1.jpg")
cv2.imshow("image",src)
cv2.namedWindow("image",cv2.WINDOW_AUTOSIZE)threshold(src)cv2.waitKey(0)
cv2.destroyAllWindows()

效果图如下:在这里插入图片描述

在这里插入图片描述

自动与手动设置阈值

THRESH_BINARY手动设置阈值为127,像素值小于127为0黑色,大于127为255白色

import cv2
import numpy as np
from matplotlib import pyplot as pltdef threshold(image):gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)ret,binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)print("threshold value is:%s"%ret)cv2.imshow("binary",binary)src = cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\a1.jpg")
cv2.imshow("image",src)
cv2.namedWindow("image",cv2.WINDOW_AUTOSIZE)threshold(src)cv2.waitKey(0)
cv2.destroyAllWindows()

效果图如下:在这里插入图片描述
在这里插入图片描述
THRESH_BINARY_INV手动设置阈值为127,取反效果,像素值小于127为255白色,大于127为0黑色

import cv2
import numpy as np
from matplotlib import pyplot as pltdef threshold(image):gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)ret,binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY_INV)print("threshold value is:%s"%ret)cv2.imshow("binary",binary)src = cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\a1.jpg")
cv2.imshow("image",src)
cv2.namedWindow("image",cv2.WINDOW_AUTOSIZE)threshold(src)cv2.waitKey(0)
cv2.destroyAllWindows()

效果图如下:在这里插入图片描述
在这里插入图片描述
THRESH_TRUNC手动设置阈值为127,截断,像素值大于127为127,小于127为0黑色

import cv2
import numpy as np
from matplotlib import pyplot as pltdef threshold(image):gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)ret,binary = cv2.threshold(gray,127,255,cv2.THRESH_TRUNC)print("threshold value is:%s"%ret)cv2.imshow("TRUNC",binary)src = cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\a1.jpg")
cv2.imshow("image",src)
cv2.namedWindow("image",cv2.WINDOW_AUTOSIZE)threshold(src)cv2.waitKey(0)
cv2.destroyAllWindows()

效果图如下:在这里插入图片描述
在这里插入图片描述
THRESH_TOZERO手动设置阈值为127,截断,像素值小于127为0黑色,大于127像素值不变

import cv2
import numpy as np
from matplotlib import pyplot as pltdef threshold(image):gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)ret,binary = cv2.threshold(gray,127,255,cv2.THRESH_TOZERO)print("threshold value is:%s"%ret)cv2.imshow("TOZERO",binary)src = cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\a1.jpg")
cv2.imshow("image",src)
cv2.namedWindow("image",cv2.WINDOW_AUTOSIZE)threshold(src)cv2.waitKey(0)
cv2.destroyAllWindows()

效果图如下:在这里插入图片描述

在这里插入图片描述

2、局部阈值

Ⅰ局部自适应阈值方法

①THRESH_MEAN_C

MEAN_C:将图片分为若干个小方格,求出每一个方格中像素的均值,判断均值是否大于自定义的阈值,大于阈值为白色,小于阈值为黑色
adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,25,10)
gray必须为灰度图
255为maxValue
25为blockSize,必须是奇数
10为C,是一个常量,每个像素块的均值与计算出来的均值差不能大于10,否则视为无效,其目的为了防止噪声的影响

import cv2
import numpy as np
from matplotlib import pyplot as pltdef local_threshold(image):gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)binary = cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,25,10)cv2.imshow("MEAN_C",binary)src = cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\a1.jpg")
cv2.imshow("image",src)
cv2.namedWindow("image",cv2.WINDOW_AUTOSIZE)local_threshold(src)cv2.waitKey(0)
cv2.destroyAllWindows()

效果图如下:
在这里插入图片描述

②THRESH_GAUSSIAN_C

GAUSSIAN_C:将图片分为若干个小方格,求出每一个方格中像素的均值并乘以相应的高斯权重(中间的权重更大),判断均值是否大于自定义的阈值,大于阈值为白色,小于阈值为黑色
adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,25,10)
gray必须为灰度图
255为maxValue
25为blockSize,必须是奇数
10为C,是一个常量,每个像素块的均值与计算出来的均值差不能大于10,否则视为无效,其目的为了防止噪声的影响

import cv2
import numpy as np
from matplotlib import pyplot as pltdef local_threshold(image):gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)binary = cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,25,10)cv2.imshow("binary",binary)src = cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\a1.jpg")
cv2.imshow("image",src)
cv2.namedWindow("image",cv2.WINDOW_AUTOSIZE)
local_threshold(src)
cv2.waitKey(0)
cv2.destroyAllWindows()**

效果图如下:
在这里插入图片描述

Ⅱ自己计算均值然后对图像进行分割从而达到图像二值化效果

import cv2
import numpy as np
from matplotlib import pyplot as pltdef custom_threshold(image):gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)h,w = gray.shape[:2]m = np.reshape(gray,[1,h*w])mean = m.sum()/h*wprint("mean:",mean)ret ,binary = cv2.threshold(gray,mean,255,cv2.THRESH_BINARY)cv2.imshow("binary",binary)src = cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\a1.jpg")
cv2.imshow("image",src)
cv2.namedWindow("image",cv2.WINDOW_AUTOSIZE)custom_threshold(src)cv2.waitKey(0)
cv2.destroyAllWindows()

效果图如下:在这里插入图片描述
在这里插入图片描述

三、超大图像二值化

Ⅰ自动全局方法操作

思想:对超大图像进行分块二值化操作

import cv2
import numpy as np
from matplotlib import pyplot as pltdef big_image_binary(image):print(image.shape)cw = 256ch = 256h,w = image.shape[:2]gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)for row in range(0,h,ch):for col in range(0,w,cw):roi = gray[row:row+ch,col:col+cw]ret,dst = cv2.threshold(roi,0,255,cv2.THRESH_BINARY|cv2.THRESH_OTSU)gray[row:row+ch,col:col+cw] = dstprint(np.std(dst),np.mean(dst))cv2.imwrite(r"G:\Juptyer_workspace\study\opencv\opencv3\big1.jpg",gray)src = cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\big.jpg")
cv2.imshow("image",src)
cv2.namedWindow("image",cv2.WINDOW_AUTOSIZE)
big_image_binary(src)cv2.waitKey(0)
cv2.destroyAllWindows()

效果图如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

对图像噪声进行过滤之后进行全局二值化操作

import cv2
import numpy as np
from matplotlib import pyplot as pltdef big_image_binary(image):print(image.shape)cw = 256ch = 256h,w = image.shape[:2]gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)for row in range(0,h,ch):for col in range(0,w,cw):roi = gray[row:row+ch,col:col+cw]print(np.std(roi),np.mean(roi))dev = np.std(roi)if dev < 15:gray[row:row+ch,col:col+cw] = 255else :ret,dst = cv2.threshold(roi,0,255,cv2.THRESH_BINARY|cv2.THRESH_OTSU)gray[row:row+ch,col:col+cw] = dstcv2.imwrite(r"G:\Juptyer_workspace\study\opencv\opencv3\big3.jpg",gray)src = cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\big.jpg")
cv2.imshow("image",src)
cv2.namedWindow("image",cv2.WINDOW_AUTOSIZE)
big_image_binary(src)cv2.waitKey(0)
cv2.destroyAllWindows()

效果图如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Ⅱ自适应局部方法操作

import cv2
import numpy as np
from matplotlib import pyplot as pltdef big_image_binary(image):print(image.shape)cw = 256ch = 256h,w = image.shape[:2]gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)for row in range(0,h,ch):for col in range(0,w,cw):roi = gray[row:row+ch,col:col+cw]dst = cv2.adaptiveThreshold(roi,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,127,20)gray[row:row+ch,col:col+cw] = dstprint(np.std(dst),np.mean(dst))cv2.imwrite(r"G:\Juptyer_workspace\study\opencv\opencv3\big2.jpg",gray)src = cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\big.jpg")
cv2.imshow("image",src)
cv2.namedWindow("image",cv2.WINDOW_AUTOSIZE)
big_image_binary(src)cv2.waitKey(0)
cv2.destroyAllWindows()

效果图如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

地毯店 如何辨别地毯的好坏?

在实地选购地毯品牌时&#xff0c;许多地方需要引起注意&#xff0c;而且要显得专业&#xff0c;这样才能科学深入地辨别地毯的好坏。比如&#xff0c;辨明拉绞地毯和抽绞地毯两种工艺的打结方法几乎相同&#xff0c;只是变绞形式上有所区别。抽绞的方式较古老&#xff0c;一般…

十二、图像金字塔

一、原理 reduce高斯模糊降采样 expand扩大卷积 PyrDown&#xff1a;降采样 PyrUp&#xff1a;还原 二、高斯金字塔 import cv2 import numpy as np from matplotlib import pyplot as pltdef pyramid(image):level 3temp image.copy()pyramid_image []for i in range(le…

LeetCode 110. 平衡二叉树思考分析

题目 给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡二叉树定义为&#xff1a; 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。 示例 1: 给定二叉树 [3,9,20,null,null,15,7] 3 / 9 20 / 15 7 返回 true 。 示例 2…

十三、图像梯度

一、两种算子 一阶导数—Sobel算子 水平梯度&#xff1a; 垂直梯度&#xff1a; 最终图像梯度&#xff1a; 二阶导数—Laplacian算子 在二阶导数的时候&#xff0c;最大变化处的值为零&#xff0c;即边缘是零值。 常见的拉普拉斯算子&#xff1a;、其所有元素之和为零。…

LeetCode 257. 二叉树的所有路径 思考分析

目录题目思路一&#xff1a;深度递归思路二&#xff1a;广度迭代关于回溯题目 给定一个二叉树&#xff0c;返回所有从根节点到叶子节点的路径。 说明: 叶子节点是指没有子节点的节点。 示例: 输入: 输出: [“1->2->5”, “1->3”] 解释: 所有根节点到叶子节点的路…

十四、Canny边缘提取

一、算法步骤 1&#xff0c;对图像进行GaussianBlur(高斯模糊)消除一些噪声 2&#xff0c;对图像进行灰度转换cvtColor 3&#xff0c;计算梯度Sobel/Scharr 4&#xff0c;非最大信号抑制 5&#xff0c;高低阈值输出二值图像 设定两个阈值T1和T2&#xff0c;凡是高于T2的都保…

图解PCB布线数字地、模拟地、电源地,单点接地抗干扰!

我们在进行pcb布线时总会面临一块板上有两种、三种地的情况&#xff0c;傻瓜式的做法当然是不管三七二十一&#xff0c;只要是地 就整块敷铜了。这种对于低速板或者对干扰不敏感的板子来讲还是没问题的&#xff0c;否则可能导致板子就没法正常工作了。当然若碰到一块板子上有多…

十五、霍夫直线检测

一、自定义 import cv2 import numpy as np from matplotlib import pyplot as pltdef line_detection(image):gray cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)edges cv2.Canny(gray,50,150,apertureSize3)lines cv2.HoughLines(edges,1,np.pi/180,200)for line in lines:rho…

【C++ grammar】对象指针、对象数组、函数参数

目录1、Object Pointer & Dynamic Object1. Accessing Object Members via Pointers2. Creating Dynamic Objects on Heap2、Array of Objects声明方式3、Passing Objects to Functions1、Objects as Function Arguments (对象作为函数参数)2. Objects as Function Return …

十六、霍夫圆形检测

一、获取圆形检测原理 原图如下&#xff1a; 选取一个圆的任意点设定为圆形进行绘制圆形&#xff0c;交与一点 再将平面直角坐标系上的各点&#xff0c;通过公式转到极坐标上 很明显的看出较亮的点为圆心&#xff0c;然后通过半径进行绘制出圆。 二、实现步骤 由于霍夫圆检…

商务智能与交易系统的区别

商务智能与交易系统的区别 1、系统设计的区别 商务智能与交易系统之间的差异主要体现在系统设计和数据类型上&#xff08;见表 1.1 和表1.2&#xff09;。交易系统把结构强加于商务之上&#xff0c;不管谁来进行一项交易活动&#xff0c; 都会遵循同样的程序和规则&#xff0c;…

LeetCode 572. 另一个树的子树 思考分析

题目 给定两个非空二叉树 s 和 t&#xff0c;检验 s 中是否包含和 t 具有相同结构和节点值的子树。s 的一个子树包括 s 的一个节点和这个节点的所有子孙。s 也可以看做它自身的一棵子树。 示例 1: 给定的树 s: 示例 2: 给定的树 s: 思路 思路&#xff1a;首先层序遍历s树…

十七、轮廓发现

一、轮廓发现原理 轮廓发现是在图像边缘提取的基础上寻找对象轮廓的方法&#xff0c;故边缘提取的阈值的选定会影响到最终轮廓发现的结果。 其本质是基于二值图像的&#xff0c;边缘提取常用Canny进行提取边缘 轮廓发现也是基于拓扑结构&#xff0c;扫描连通图&#xff0c;最后…

关于 WebRequest.RegisterPrefix

RegisterPrefix 方法将 WebRequest 子代注册到服务请求。 WebRequest 后代通常被注册来处理特定的协议&#xff08;例如 HTTP 或 FTP&#xff09;&#xff0c;但也可能被注册来处理对特定服务器或服务器上的路径的请求。 已注册的预注册保留类型包括下列类型&#xff1a; htt…

LeetCode 404. 左叶子之和思考分析

题目 计算给定二叉树的所有左叶子之和。 如果是下面的树&#xff0c;只有一个左叶子结点4 思考分析 由此我们可以得到左叶子结点的定义&#xff1a; cur->left !NULL && cur->left->leftNULL && cur->left->rightNULL 递归遍历累积操作 …

十八、对已经找到轮廓的图像进行测量

图像轮廓的获取可参考博文十七 一、相关原理 1&#xff0c;弧长和面积 对于弧长和面积&#xff0c;计算出来的轮廓单位都是像素 2&#xff0c;多边形拟合 每一个轮廓都是一系列的点&#xff0c;然后通过多边形进行拟合&#xff0c;无限的接近真实形状 相关API&#xff1a;…

Linux 终端登录SSH:解决SSH的Access Denied 和 make xconfig的使用

对于SSH&#xff1a; 可以不是用putty&#xff0c;尤其是putty出现 Access denied 的时候&#xff0c;请换用konsole 或者其他终端 &#xff08;如 terminal&#xff09;在command line中&#xff1a; # ssh 要访问的主机ip eg &#xff1a; ssh 192.168.111 然后确定…

LeetCode 513. 找树左下角的值 思考分析

题目 给定一个二叉树&#xff0c;在树的最后一行找到最左边的值。 递归解 左下角要满足两个条件&#xff1a; 1、深度最大的叶子结点 2、最左结点&#xff1a;使用前序遍历&#xff0c;优先左边搜索。 1、确定递归函数的参数和返回值 参数&#xff1a;树的根结点&#xff…

Linux 平台下 MySQL 5.5 安装 说明 与 示例

一.下载说明前期的一些准备说明&#xff0c;参考&#xff1a;MySQL 发展史http://blog.csdn.net/tianlesoftware/article/details/6999245Mysql 不同版本 说明http://blog.csdn.net/tianlesoftware/article/details/6723117 MySQL 分为Community Server 和 Enterprise Edition。…

LeetCode 112. 路径总和 、113. 路径总和 II 思考分析

目录112. 路径总和题目递归解递归解&#xff0c;其他人的解法迭代解&#xff0c;其他人的解法113. 路径总和 II题目递归解递归解&#xff0c;参考别人的思路112. 路径总和 题目 给定一个二叉树和一个目标和&#xff0c;判断该树中是否存在根节点到叶子节点的路径&#xff0c;…