阈值分割

opencv学习记录之阈值处理

三世轮回 提交于 2020-01-17 20:19:08
阈值处理是指将图像内高于一定值或者低于一定值的像素点进行处理 函数形式为: retval ,dst = cv2.thresshold( src , thresh , maxval , type ) retval代表返回的阈值 dst代表阈值分割结果图像,与原始图像有相同的大小和类型 src代表要进行分割的图像,可以是多通道的 thresh代表要设定的阈值 maxval代表当type为THRESH_BINARY或者THRESH_BINARY_INV类型时,需要设定的最大值 type代表阈值分割的类型 具体类型如下 二值化阈值处理(cv2.THRESH_BINARY) 处理之后图像为只有两个值的二值图像 对于8位灰度图像,将超过阈值thresh的值处理为最大值255,低于阈值的处理位0 1 import cv2 2 import numpy as np 3 img=np.random.randint(0,256,size=[4,5],dtype=np.uint8) 4 t,rst=cv2.threshold(img,127,255,cv2.THRESH_BINARY) 5 print("img=\n",img) 6 print("t=",t) 7 print("rst=\n",rst) img= [[ 98 151 50 196 238] [ 45 64 225 227 204] [

验证码识别之二值化

独自空忆成欢 提交于 2020-01-14 12:58:45
前言 二值化顾名思义就是将数变成两种值,一般非0即1。而在验证码处理中,如果直接使用灰度图,那么每个像素的值会在0-255,这样肯定会增加计算时间,而二值化后每个像素的值只是0和1。 在前面的简单验证码识别中,我的二值化代码是这样写的: a = (a > 180) * 255 ,至于这里为什么不乘1而乘255,因为我要显示图片看看效果。如果只是用于算法识别的话,乘1会更好。但是,这里的180也就是二值化的阈值是如何得到的,开始是通过一个一个试然后看效果哪个好就选哪个,因为我们一般只识别某个网站的验证码,这样只要测试几次得到结果后便可用于这个网站其他的验证码。 这样测试有点浪费时间,虽然是一次性的,但是你手动测出的验证码不一定是最合适的。所以我们需要算法去自动计算出验证码的阈值,算法有很多,这里我们使用迭代法和最大类间方差法,通过这两个算法计算出来的阈值基本差不多。 迭代法 求出图像中的最小灰度值和最大灰度值,分别记为Gmin和Gmax,则阈值初值T0=(Gmin+Gmax)/2; 根据阈值T0将图像分割成前景和背景两部分,求出两部分的平均灰度值m1和m2,平均灰度值=总灰度值/像素个数 求出新阈值T1=(m1+m2)/2 如果T0=T1,则结束,否则将T1的值赋予T0,从第2步重新计算。 算法实现如下: import numpy as np from PIL import

图像处理与分析

天大地大妈咪最大 提交于 2020-01-10 03:25:57
基本概念 图像的采样和量化 光照本身是连续的、但是转换成数字形式必然是不连续的 在坐标值(空间)上的数字化即为采样,对幅值的数字化即为量化 量化——每一像素值只能用有限位比特表示,故只能表现有限的精度 可以看作是笛卡儿积 Z 2 Z^2 Z 2 中的一对元素,映射到灰度值集合上的一个映射。 空间分辨率:如dpi每英寸点数;灰度分辨率直接用比特表示 图像插值 最简单的是最近邻方法,其次是双线性,最后是双三次 双线性:可以看作是在一个方格内拟合 f ( x , y ) = a + b x + c y + d x y f(x,y)=a+bx+cy+dxy f ( x , y ) = a + b x + c y + d x y ,比较好的特点是无论固定x还是固定y,关于另一个变量都是线性的。 像素间关系 4领域、8领域、m邻接(m邻接可以消除8邻接的二义性 连通性、区域、边界 距离的度量:非负、自反、交换、三角 常用计算 矩阵与阵列计算 灰度算术 集合和逻辑操作 空间操作(几何空间变换与图像配准 一般来说反向映射比前向映射要好,可以配合插值算法决定每个像素的输出值 把图像当作一个向量,然后乘以矩阵 图像变到某个变换域去(通常通过某个正交变换核 彩色图像 光的三原色为RGB 颜料的三原色为CMYK(青、品红、黄、黑 HSI 色调、饱和度、强度 图像增强 灰度变换 略 直方图处理 直方图

自适应阈值化-adaptiveThreshold-0

£可爱£侵袭症+ 提交于 2020-01-09 21:50:18
函数 void adaptiveThreshold(InputArray src, OutputArray dst, double maxValue, int adaptiveMethod, int thresholdType, int blockSize, double C) InputArray src:源图像 OutputArray dst:输出图像,与源图像大小一致 int adaptiveMethod:在一个邻域内计算阈值所采用的算法,有两个取值,分别为 ADAPTIVE_THRESH_MEAN_C 和 ADAPTIVE_THRESH_GAUSSIAN_C 。 ADAPTIVE_THRESH_MEAN_C的计算方法是计算出领域的平均值再减去第七个参数double C的值 ADAPTIVE_THRESH_GAUSSIAN_C的计算方法是计算出领域的高斯均值再减去第七个参数double C的值 int thresholdType:这是阈值类型,只有两个取值,分别为 THRESH_BINARY 和THRESH_BINARY_INV 具体的请看官方的说明,这里不多做解释 int blockSize:adaptiveThreshold的计算单位是像素的邻域块,邻域块取多大,就由这个值作决定 double C:在对参数int adaptiveMethod的说明中

图像阈值

匆匆过客 提交于 2019-12-30 15:15:37
  阈值是图像分割的标准尺度,一个值把像素分为两边,从而进行提取目标图像,阈值操作要针对灰度图像。 阈值二值化 阈值反二值化 阈值截断 阈值取零 下图为原图和二值化阈值后的效果: 下图为原图和反二值化阈值后的效果(即黑白颠倒) 相关阈值函数为: 图像阈值函数:threshold(out1, out2, 127, 255, THRESH_BINARY_INV); // 127为阈值的值, 255上限, THRESH_BINARY_INV为执行的阈值类型。 阈值类型有如下几种:其中倒数第二个THRESH_OTSU为自动计算阈值。 来源: https://www.cnblogs.com/fuzhuoxin/p/12119804.html

基于全局阈值的图像分割

末鹿安然 提交于 2019-12-23 15:15:29
** 基于全局阈值的图像分割 ** I=imread('F:\20191214162428.jpg'); figure,imshow(I); I2=rgb2gray(I); T=mean2(I2); count=0; d=T; while d>0.5 count=count+1; g=I2>T; Tnew=0.5*(mean2(I2(g))+mean2(I2(~g))); d=abs(Tnew-T); T=Tnew; end figure,imshow(I2); figure,imhist(I2); I3=im2bw(I2,T/255); figure,imshow(I3); count=4 T=139.9443 原图: 灰度图: 灰度直方图:从图中可以看出,有三个波峰,其实不适合用阈值处理的方式进行图像分割,只是拿来练手,如果追求更高水平的分割效果可采用其他方法。 分割结果图: 来源: CSDN 作者: qq_39622795 链接: https://blog.csdn.net/qq_39622795/article/details/103663147

图像分割—基于图的图像分割(Graph-BasedImageSegmentation)

|▌冷眼眸甩不掉的悲伤 提交于 2019-12-07 16:09:04
图像分割—基于图的图像分割(Graph-Based Image Segmentation) Reference: Efficient Graph-Based Image Segmentation,IJCV 2004,MIT Code Graph-Based Segmentation 是经典的图像分割算法,作者Felzenszwalb也是提出DPM算法的大牛。该算法是基于图的 贪心聚类 算法,实现简单,速度比较快,精度也还行。不过,目前直接用它做分割的应该比较少,毕竟是99年的跨世纪元老,但是很多算法用它作垫脚石,比如Object Propose的开山之作《Segmentation as Selective Search for Object Recognition》就用它来产生过分割(oversegmentation)。还有的语义分割(senmatic segmentation )算法用它来产生超像素(superpixels)具体忘记了…… 图的基本概念 因为该算法是将照片用加权图抽象化表示,所以补充图的一些基本概念。 图 是由 顶点 集 (vertices)和 边 集 (edges)组成,表示为 ,顶点 ,在本文中即为单个的像素点,连接一对顶点的边 具有 权重 ,本文中的意义为顶点之间的 不 相似度,所用的是 无向图 。 树: 特殊的图,图中任意两个顶点,都有路径相连接,但是没有

OTSU阈值化

被刻印的时光 ゝ 提交于 2019-12-06 08:44:18
OTSU算法是由日本学者OTSU于1979年提出的一种对图像进行二值化的高效算法。如下是C++实现opencv OTSU阈值化的代码(opencv版本是3.0): 头文件: #include <stdio.h> #include <string> #include "opencv2/highgui/highgui.hpp" #include "opencv2/opencv.hpp" using namespace std; using namespace cv; 大津法函数: int OTSU(cv::Mat srcImage) { int nCols = srcImage.cols; int nRows = srcImage.rows; int threshold = 0; // 初始化统计参数 int nSumPix[256]; float nProDis[256]; for (int i = 0; i < 256; i++) { nSumPix[i] = 0; nProDis[i] = 0; } // 统计灰度级中每个像素在整幅图像中的个数 for (int i = 0; i < nCols; i++) { for (int j = 0; j < nRows; j++) { nSumPix[(int)srcImage.at<uchar>(i, j)]++; } } //

opencv图像阈值操作

余生长醉 提交于 2019-12-06 06:40:58
使用threshold方法和adaptivethreshold方法对图像进行阈值分割操作。 1、使用threshold方法,设置一个阈值,将大于阈值的值变换为最大值,小于阈值的值变换为0。 #-*- coding:utf-8 -*- # opencv 中阈值操作 import cv2 import numpy #读取一张图片 img = cv2.imread('bookback.jpg',cv2.IMREAD_COLOR) gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #使用threshold方法进行阈值分割,大于阈值的设置为255,小于阈值的为0 ret,threshold = cv2.threshold(img,10,255,cv2.THRESH_BINARY) #对灰度图像进行阈值处理 ret1,threshold1 = cv2.threshold(gray,10,255,cv2.THRESH_BINARY) #显示图像 cv2.imshow('original',img) cv2.imshow('threshold',threshold) cv2.imshow('gray_threshold',threshold1) cv2.waitKey(0) cv2.destroyAllWindows()  效果:由上到下依次是:原图

图像分割之canny边缘检测

北城余情 提交于 2019-12-05 22:01:39
转载 http://www.cnblogs.com/techyan1990/p/7291771.html 1. 写在前面 最近在做边缘检测方面的一些工作,在网络上也找了很多有用的资料,感谢那些积极分享知识的先辈们,自己在理解Canny边缘检测算法的过程中也走了一些弯路,在编程实现的过程中,也遇到了一个让我怀疑人生的BUG(日了狗狗)。就此写下此文,作为后记,也希望此篇文章可以帮助那些在理解Canny算法的道路上暂入迷途的童鞋。废话少说,上干货。 2. Canny边缘检测算法的发展历史 Canny边缘检测于1986年由JOHN CANNY首次在论文《A Computational Approach to Edge Detection》中提出,就此拉开了Canny边缘检测算法的序幕。 Canny边缘检测是从不同视觉对象中提取有用的结构信息并大大减少要处理的数据量的一种技术,目前已广泛应用于各种计算机视觉系统。Canny发现,在不同视觉系统上对边缘检测的要求较为类似,因此,可以实现一种具有广泛应用意义的边缘检测技术。边缘检测的一般标准包括: 1) 以低的错误率检测边缘,也即意味着需要尽可能准确的捕获图像中尽可能多的边缘。 2) 检测到的边缘应精确定位在真实边缘的中心。 3) 图像中给定的边缘应只被标记一次,并且在可能的情况下,图像的噪声不应产生假的边缘。 为了满足这些要求