二值化

【数字图像处理】腐蚀运算与膨胀运算

匿名 (未验证) 提交于 2019-12-03 00:07:01
形态学基本概念 基本思想:用一定形态的结构元素去度量和提取图像中的对应形状,达到分析知识的目的。可用于图像处理的各个方面,包括图像分割、边界检测、特征提取。 结构元素:形态学变换中的基本元素,使为了探测图像的某种结构信息而设计的特定形状和尺寸的图像,称为收集图像结构信息的探针。 结构元素有多种类型:如圆形、方形、线型等,可携带知识(形态、大小、灰度和色度信息)来探测、研究图像的结构特点。 形态学运算包括:二值化腐蚀和膨胀、二值化开闭运算、骨架抽取、击中击不中变换等。 形态学四个基本算子:膨胀,腐蚀、开启和闭合组成,这些基本运算还可以推导和组合成各种数学形态学实用算法。 腐蚀运算 腐蚀运算思路 :定义结构元素(与模板类似),结构元素在整幅图像中移动,移动到每个像素点上,只有结构元素与图像上对应像素点的像素值全部相等时,保留这个像素点的值。 腐蚀运算作用 :消除物体边界点,使边界点向内部收缩,可以把小于结构元素的物体去除。选取不同大小的结构元素,去除不同大小的物体。如两个物体间有细小的连通,通过腐蚀可以将两个物体分开。 腐蚀运算 : 腐蚀运算示意图 : 基本方法: 通常拖到结构元素在X域移动,在每一个位置上,当结构元素B在中心平移到X图像上的某优点(x,y)。 如果结构元素内的每一个像素都与以(x,y)为中心的相同邻域中对应像素完全相同,那么就保留(x,y)像素点。

adaptiveThreshold(自适应阈值)

匿名 (未验证) 提交于 2019-12-02 23:56:01
void adaptiveThreshold ( InputArray src , OutputArray dst , double maxValue , int adaptiveMethod , int thresholdType , int blockSize , double C ); 函数功能 对一幅灰度图像进行二值化,该函数支持就地操作,该函数用下面的公式对一幅灰度图像进行二值化: (1)正向二值化,THRESH_BINARY (2)反向二值化,THRESH_BINARY_INV 参数详解 第一个参数,InputArray src,原图,即输入图像,是一个8位单通道的图像; 第二个参数,OutputArray dst,目标图像,与原图像具有同样的尺寸与类型; 第三个参数,double maxValue,分配给满足条件的像素的非零值; 第四个参数,int adaptiveMethod,自适应阈值的方法,通常有以下几种方法; ADAPTIVE_THRESH_MEAN_C,阈值T(x,y)是(x,y)减去C的Blocksize×Blocksize邻域的平均值。 ADAPTIVE_THRESH_GAUSSIAN_C ,阈值T(x,y)是(x,y)减去C的Blocksize×Blocksize邻域的加权和(与高斯相关),默认sigma(标准差)用于指定的Blocksize

opencv的C++实现将图片二值化后提取像素信息保存至txt文档中,再从txt文档中读取图片像素信息恢复成灰度图并保存

匿名 (未验证) 提交于 2019-12-02 23:32:01
#include <opencv2/opencv.hpp> #include #include using namespace std; using namespace cv; int main() { //将图片二值化后提取像素信息保存至txt文档中 string filename = "path.png";//图片路径 Mat src = imread(filename); cvtColor(src, src, CV_BGR2GRAY); imshow("原图", src); fstream file("path.txt", ios::out);//保存像素信息的txt文本路径 stringstream ss; string data0; for (int nrows = 0; nrows < src.rows; nrows++) { for (int ncols = 0; ncols < src.cols; ncols++) { int gray = src.at<uchar>(nrows, ncols); ss << hex << gray; ss >> data0; ss.clear(); file << data0 << " "; } file << endl; } file.close(); //从txt文档中读取图片像素信息恢复成灰度图并保存 fstream

Python tesserocr模块使用示例

匿名 (未验证) 提交于 2019-12-02 22:56:40
python版本:3.6.5 依赖模块:PIL、tesserocr。   需要说明的是,在windows系统上PowerShell通过PIP3 install tesserocr安装验证码识别模块时,需要先安装 Tesseract ( 一款由HP实验室开发由Google维护的开源 OCR (Optical Character Recognition , 光学字符识别)引擎,与Microsoft Office Document Imaging(MODI)相比,我们可以不断的训练的库,使图像转换文本的能力不断增强。 )可执行文件。   以中国知网的注册页面为例,我们常被要求输入这类简单的字母组成,背景含很多杂线的验证码,如下图所示: 我们对验证码另存为到本地代码所在目录,取名:test.png. 下图是直接用对应模块识别的代码示例: import tesserocr from PIL import Image image=Image.open(‘test.png‘) image.show() #可以打印出图片,供预览 print(tesserocr.image_to_text(image))      原始图片尺寸较小,极少情况下如果无法正常识别,可以借助图片处理工具PIL模块进行图片等比例放大后保存。此例中直接运行上述代码,结果为“VHIHI”,即使是肉眼可见较为清晰的验证码

python-opencv函数总结之(一)threshold、adaptiveThreshold、Otsu 二值化

匿名 (未验证) 提交于 2019-12-02 22:54:36
https://blog.csdn.net/sinat_21258931/article/details/61418681#commentsedit threshold:固定阈值二值化, ret, dst = cv2.threshold(src, thresh, maxval, type ) 1 src: 输入图,只能输入单通道图像,通常来说为灰度图 dst: 输出图 thresh: 阈值 maxval: 当像素值超过了阈值(或者小于阈值,根据type来决定),所赋予的值 type:二值化操作的类型,包含以下5种类型: cv2.THRESH_BINARY; cv2.THRESH_BINARY_INV; cv2.THRESH_TRUNC; cv2.THRESH_TOZERO;cv2.THRESH_TOZERO_INV 官方文档的示例代码: import cv2 import numpy as np from matplotlib import pyplot as plt img = cv2.imread( 'gradient.png' , 0 ) ret,thresh1 = cv2.threshold(img, 127 , 255 ,cv2.THRESH_BINARY) ret,thresh2 = cv2.threshold(img, 127 , 255 ,cv2.THRESH

图像二值化

匿名 (未验证) 提交于 2019-12-02 21:53:52
一般所说的黑白图片,其实在黑白之间还有深浅不一的各种灰色。所谓二值化,即是将这样的图转为仅有纯黑和纯白两种颜色。这在图像处理中有不少应用,博客园上有不少文章讲解得很详细。我所关注的仅是一种应用。本来白纸黑字的内容,因为拍摄的关系,而带上其他颜色,或是年代久远,纸张泛黄,造成内容的对比度下降,有时甚至难以分辨。此时,可以应用二值化算法,将颜色恢复为黑白两纯色,使内容更为清淅。 在各种算法中,我个人觉得 Wolf和Jolion的方法 较好,并且他们提供了源代码。我将他们的方法用Javascript实现,写成一个简单的页面,见此 链接 。将图片拖入框中作处理,下方的滑条调整k值。k值具体意义可阅读论文,大致上,较小的k值会使更多的部分被判定为黑色。 来源:博客园 作者: 枣木夹子 链接:https://www.cnblogs.com/wildabc/p/8335319.html

女朋友要你给她画个素描?不要慌,教你用Python分分钟弄出来!

血红的双手。 提交于 2019-12-02 13:03:36
---恢复内容开始--- 素描作为一种近乎完美的表现手法有其独特的魅力,随着数字技术的发展,素描早已不再是专业绘画师的专利,今天这篇文章就来讲一讲如何使用python批量获取小姐姐素描画像。文章共分两部分: 第一部分介绍两种使用python生成素描画的思路 第二部分介绍如何批量获取素描画 获取素描图的两个思路 本部分介绍的两个思路都是基于opencv来实现,不涉及深度学习相关内容。基本思想是读入一张照片图,然后通过各种变换转化成素描图。为了演示方便,我们先找来一张小姐姐的照片作为实验素材。 漫画风格 先来说第一种方法,这种方法的核心思想是利用了名为“阈值化”的技术,这种技术是基于图像中物体与背景之间的灰度差异,而进行的像素级别的分割。 如果想要把一张图片转化为只呈现黑色和白色的素描图,就需要对其进行二值化操作,opencv中提供了两种二值化操作方法:threshold()和adaptiveThreshold()。相比threshold(),adaptiveThreshold()能够根据图像不同区域亮度分布进行局部自动调节,因此被称为自适应二值化。下面这幅图就是对彩色图片进行二值化操作后的效果。 上面提到的概念可能比较晦涩,不理解也没有关系,下面我们重点讲讲怎么进行实际操作。 第一步,读入图片并转化为灰度图。这一步算是常规操作了,相信使用过opencv的同学都写过类似的代码。 img

如何用minist神经网络识别自己写在纸上的数字

夙愿已清 提交于 2019-12-02 12:47:05
前言 这里分两个程序来完成,第一个程序训练并且保存字体识别模型;第二个程序是输入自己的手写数字在纸上的照片并处理然后识别。minist跟tensorflow官网的介绍大同小易,这里只简要介绍。 背景 神经网络是一种仿生的结果,通过模仿神经元对人类的储存记忆的作用,演化成为利用样本训练模型,并用模型预测新的样本。 模型训练和保存 minst.py,完整可视化代码见 from __future__ import absolute_import, division, print_function, unicode_literals # 用matplotlib可以画图 import matplotlib.pyplot as plt import numpy as np # from tensorflow.examples.tutorials.mnist import input_data # TensorFlow and tf.keras import tensorflow as tf from tensorflow import keras # old_v = tf.logging.get_verbosity() # tf.logging.set_verbosity(tf.logging.ERROR) print(tf.__version__)# tensorflow版本 # 显示函数

【数字图像处理】图像的水平与垂直投影

强颜欢笑 提交于 2019-12-02 00:29:52
图像的水平与垂直投影 作用:二值图像或明显特征的灰度图定位或分割前景与背景,经常用到投影法。 水平方向投影,将图像数组进行列求和; 垂直方向投影,将图像数组进行行求和; 如汽车牌照的定位:先对汽车图像二值化,然后水平投影,找出牌照的上下位置和高度,再对上次定位的牌照图像竖直投影,找出牌照有数字部分的总宽度,切割出来。再进行投影,每个字符的切割的外接矩形找到了,每个字符切割出来,提取特征,比如黑像素所占份数5X5格,和每个数的模版库进行匹配。进行细化,使数据量更规范更统一了,然后牌照标准化。 水平投影的实现步骤: 1.图像二值化,物体为黑,背景为白 2.循环各行,依次判断每一列的像素值是否为黑,统计该行所有黑像素的个数。设该行共有M个黑像素,则把该行从第一列到第M列置为黑。 垂直投影的实现步骤: 1.图像二值化,物体为黑,背景为白 2.循环各列,依次判断每一行的像素值是否为黑,统计该列所有黑像素的个数。设该列共有M个黑像素,则把第一行到第行置为黑。 来源: https://www.cnblogs.com/-wenli/p/11723185.html

【数字图像处理】图像的面积与周长计算

旧时模样 提交于 2019-12-02 00:09:28
二值化图像区域标记 在二值化图像中,相互联结的黑像素集合成为一个(黑)区域,通过对图像内每个区域进行标记操作,求得区域的数目。 处理前的f是二值的,像素要么为0(黑),要么为255(白) 处理后每个像素的值即为其所处理区域的标号(1,2,3,。。。) 标记规则 1.初始化标记为0,从左到右,从上到下逐个像素扫描 2.若该点为物体颜色,则继续判断该点的左上、正上,右上及左前点是否都不为物体,则标号加1,若该点为背景色,则跳过。 3.优先级依次为右上点,正上点,左上点及左前点。右上点的优先级最高,左前点的优先级最低。 4.继续遍历图像,若右上点为物体,则该点标记上与右上点相同的值。 5.若右上不为物体,则判断正上点,左上点及左前点 特殊情况:当前点的右上点及左前点为不同标记,正上点和左上点不为物体,则当前点标记同右上点置相同的值,把所有标记与左前点相同的像素值都标记成与右上点同样的值。 如图下面的黑点,如果出现上面的特殊情况,可以这样处理: int sign_count = 0; int sum[5] = {0}; int sign_temp; for(int y = 1; y<120 - 1;y++) for(int x = 1; x<180 - 1;x++) { //只有当像素点为物体,才进行下面的判断。 if(img[y][x] == 0) { //解决特殊情况 if(img[y