图像二值化

Wellner 自适应阈值二值化算法

会有一股神秘感。 提交于 2020-03-04 19:16:11
参考文档: Adaptive Thresholding for the DigitalDesk.pdf       Adaptive Thresholding Using the Integral Image.pdf 一、问题的由来 一个现实: 当用照像机拍摄一副黑纸白字的纸张时,照相机获得的图像并不是真正的黑白图像。不管从什么角度拍摄,这幅图像实际上是灰度或者彩色的。除非仔细的设置灯光,否则照相机所拍摄的放在桌子上的纸张图像并不能代表原始效果。不像在扫描仪或打印机内部,想控制好桌子表面的光源是非常困难的。这个开放的空间可能会受到台灯、吊灯、窗户、移动的影子等影响。人类的视觉系统能自动补偿这些,但是机器没有考虑到这些因素因此拍出的效果会很差。 这个问题在处理那种高对比度的艺术线条或文字时尤为突出,因为这些东西都是真正的黑色或白色。而摄像头会产生一副具有不同等级的灰度图像。许多应用都必须清楚的知道图像的那一部分是纯黑或纯白,以便将文字传递给OCR软件去识别。这些系统无法使用灰度图像(典型的是8位每像素),因此必须将他们转换为黑白图像。这有很多种方式去实现。在某些情况下,如果这些图像最终是给人看的,这些图像会使用一些抖动技术,以便使他们看起来更像灰度图像。但是对于机器处理的过程,比如文字识别,选择复制操作,或多个图像合成,系统就不可以使用抖动的图像。系统仅仅需要简单的线条

opencv python:图像二值化

送分小仙女□ 提交于 2020-01-31 00:47:29
import cv2 as cv import numpy as np import matplotlib.pyplot as plt # 二值图像就是将灰度图转化成黑白图,没有灰,在一个值之前为黑,之后为白 # 有全局和局部两种 # 在使用全局阈值时,我们就是随便给了一个数来做阈值,那我们怎么知道我们选取的这个数的好坏呢?答案就是不停的尝试。 # 如果是一副双峰图像(简 单来说双峰图像是指图像直方图中存在两个峰)呢? # 我们岂不是应该在两个峰之间的峰谷选一个值作为阈值?这就是 Otsu 二值化要做的。 # 简单来说就是对 一副双峰图像自动根据其直方图计算出一个阈值。 # (对于非双峰图像,这种方法 得到的结果可能会不理想)。 def threshold_demo(image): gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY) # 这个函数的第一个参数就是原图像,原图像应该是灰度图。 # 第二个参数就是用来对像素值进行分类的阈值。 # 第三个参数就是当像素值高于(有时是小于)阈值时应该被赋予的新的像素值 # 第四个参数来决定阈值方法,见threshold_simple() # ret, binary = cv.threshold(gray, 127, 255, cv.THRESH_BINARY) ret, binary = cv

python将二值化图像像素值变为0和1并写成txt文件

你说的曾经没有我的故事 提交于 2019-12-21 14:27:20
import os from PIL import Image def init ( fileList , n ) : for i in range ( 2 , n ) : img = Image . open ( "G:\\detect\\" + str ( fileList [ i ] ) ) new_img = img . resize ( ( 32 , 32 ) ) w , h = new_img . size with open ( "G:\\detect\\chepai" + str ( i ) + ".txt" , "w" ) as f : for c in range ( h ) : for j in range ( w ) : f . write ( str ( int ( ( 255 - ( new_img . getpixel ( ( j , c ) ) ) ) / 255 ) ) ) if j == w - 1 : f . write ( "\n" ) f . close ( ) if __name__ == "__main__" : fileList = os . listdir ( "G:\\detect" ) n = len ( fileList ) init ( fileList , n ) 可用作识别手写数字数据集。 来源: CSDN 作者:

图像的二值化

徘徊边缘 提交于 2019-12-07 20:35:28
#include <opencv2/opencv.hpp> #include <iostream> #include <math.h> using namespace cv; using namespace std; Mat src, dst,dst2,gray_src; char* INPUT_WIN = "input image"; char* output_title = "binary image"; int threshold_value = 127; int threshold_max = 255; int type_value = 2; int type_max = 4; void Threshold_Demo(int, void*) { cvtColor(src, gray_src, CV_BGR2GRAY); //threshold(gray_src, dst, threshold_value, threshold_max, THRESH_BINARY); //反二值化 //threshold(gray_src, dst, threshold_value, threshold_max, THRESH_BINARY_INV); //type_value有如下类型: //THRESH_BINARY //THRESH_BINARY_INV //THRESH_THRESH

opencv中对图片的二值化操作并提取特定颜色区域

烈酒焚心 提交于 2019-12-06 06:36:58
一、最近因为所在的实习公司要求用opencv视觉库来写一个对图片识别并提取指定区域的程序。看了很多资料,只学会了皮毛,下面附上简单的代码。运行程序之前需要安装opencv库,官网地址为: https://opencv.org/ 。直接下载安装包到本地,解压即可。本人的opencv版本为24.10 。集成环境是visual studio 2013。 1 #include<opencv2/core/core.hpp> 2 #include<opencv2/highgui/highgui.hpp> 3 #include<opencv2/imgproc/imgproc.hpp> 4 #include <vector> 5 #include<iostream> 6 #include<string> 7 8 using namespace std; 9 using namespace cv; 10 //bgr图像 11 Mat bgr; 12 //HSV图像 13 Mat hsv; 14 //色相 15 int hmin = 0;//h分量取下限 16 int hmax = 180;//h分量取上限 17 int h_Max = 180; //h分量可取的最大值 18 //饱和度 19 int smin = 0;//s分量取下限 20 int smax = 255;//s分量取上限 21

基于opencv的Niblack二值化算法

匿名 (未验证) 提交于 2019-12-03 00:18:01
Niblack算法是比较出名的二值化算法,网上很多Niblack代码是基于Matlab的,本人觉得其速度比较慢,所以便基于OpenCV改写了其算法,具体参考的博客链接已经忘记了,希望博主原谅。如果缺少某些函数,比如最大值最小值函数,可以参考本人其他博客, 里面会提供 。废话不多说,直接上代码: /** @brief 计算单通道灰度图像的平均值 @param src 单通道灰度图 */ static double GetMatAverage( const cv::Mat& src) { CV_Assert(src.type() == CV_8UC1); double sum = 0.0 ; for ( int y = 0 ; y < src.rows; ++y) { for ( int x = 0 ; x < src.cols; ++x) { int value = src.at<uchar>(y, x); sum += value; } } return sum / (src.rows * src.cols); } /** @brief 计算单通道灰度图像的标准差 @param src 单通道灰度图 */ static double GetMatStdDev( const cv::Mat& src, double meanValue) { CV_Assert(src.type()

阈值二值化

萝らか妹 提交于 2019-11-29 02:35:13
五种类型阈值二值化 代码: #include <opencv2/opencv.hpp> #include <iostream> #include <math.h> using namespace cv; Mat src, gray_src, dst; int threshold_value = 127; int threshold_max = 255; int type_value = 2; int type_max = 4; const char* output_title = "binary image"; void Threshold_Demo(int, void*); int main(int argc, char** argv) { src = imread("L:/4.jpg"); if (!src.data) { printf("could not load image...\n"); return -1; } namedWindow("input image", CV_WINDOW_AUTOSIZE); namedWindow(output_title, CV_WINDOW_AUTOSIZE); imshow("input image", src); createTrackbar("Threshold Value:", output_title,

python图片二值化提高识别率

血红的双手。 提交于 2019-11-28 08:47:51
   import cv2 from PIL import Image from pytesseract import pytesseract from PIL import ImageEnhance import re import string def createFile(filePath,newFilePath): img = Image.open(filePath) # 模式L”为灰色图像,它的每个像素用8个bit表示,0表示黑,255表示白,其他数字表示不同的灰度。 Img = img.convert('L') Img.save(newFilePath) # 自定义灰度界限,大于这个值为黑色,小于这个值为白色 threshold = 200 table = [] for i in range(256): if i < threshold: table.append(0) else: table.append(1) # 图片二值化 photo = Img.point(table, '1') photo.save(newFilePath) if __name__ == '__main__': createFile(r'1.bmp',r'newTest.png') 原图: 处理过后的图: 识别结果: 来源: https://www.cnblogs.com

图像识别技术初探(2014/2/17)

断了今生、忘了曾经 提交于 2019-11-27 23:04:35
目录 1 前言. 1 1.1 植物的发展史. 1 1.1.1 植物界的类群及多样性. 1 1.1.2 植物的分类等级. 2 1.2植物的识别方法. 3 1.2.1 花与种子的特性. 3 1.2.2 叶子的特征. 3 1.3 什么是数字图像处理. 5 1.3.1 数字图像处理概念及其意义. 5 1.3.2 数字图像处理中的基本图像类型. 6 1.3.3 图像格式分析. 7 1.4 什么是模式识别. 8 1.4.1 模式识别的概念. 8 1.4.2 模式识别研究方向. 9 1.4.3 模式识别在实际中的应用. 10 2 预处理与算法研究. 10 2.1 图像的预处理. 10 2.2 数字图像处理方法. 11 2.2.1 二值处理. 11 2.2.2 模糊模式识别算法. 12 2.2.3 边缘检测与轮廓提取. 12 3.2.4 信息存储. 14 3 算法实现. 14 3.1 分析实际工作过程. 14 3.2 算法实现过程. 15 3.2.1 掏空内部点算法的基本思想. 15 3.2.2 边界跟踪算法的基本思想. 15 3.2.3 部分实现代码. 18 4 小结分析. 25 5 参考文献. 26 6 致谢. 27 1 前言 1.1 植物的发展史 1.1.1 植物界的类群及多样性 植物界的发生和发展经历了漫长的历史,随着地球历史的发展,由原始生物不断演化,其间大约经历了30亿年