convert二值化处理,二值化处理是什么意思

http://www.itjxue.com  2023-01-05 07:45  来源:未知  点击次数: 

c#图像灰度处理及二值化处理代码解释

这代码写的很低效,不过还算清晰。

灰度处理那个很简单吧,基本上C#都自动帮你做了,你那代码就是手动遍历其中每个像素然后读取其灰度值(这里代码偷懒直接让C#帮忙计算了)然后重新把像素设置为RGB都是灰度值的颜色而已。

二值化的其实也不复杂,也是逐个遍历像素,判断某个像素的亮度是否大于给定阈值,如果大于则设置为白色否则设置为黑色。唯一有点麻烦的是要把8个像素合并到一个字节里面,于是代码里面搞了个scan数组,然后八个像素为一组填进去,每个像素占字节的一个位(白1黑0)。使用位运算0x80

(x

%

8)保证像素从左到右依次保存在字节的8个位上。你这个二值化代码回填像素信息的时候用的是Marshal的字节拷贝而已,你只要知道了位图的结构这个理解也很简单。

对图像进行二值化的处理方法,求源代码,最好是C++/C或者OPENCV

//声明IplImage指针

IplImage* pFrame = NULL;

IplImage* pFrImg = NULL;

IplImage* pBkImg = NULL;

CvMat* pFrameMat = NULL;

CvMat* pFrMat = NULL;

CvMat* pBkMat = NULL;

pBkImg = cvCreateImage(cvSize(pFrame-width, pFrame-height), IPL_DEPTH_8U,1);

pFrImg = cvCreateImage(cvSize(pFrame-width, pFrame-height), IPL_DEPTH_8U,1);

pBkMat = cvCreateMat(pFrame-height, pFrame-width, CV_32FC1);

pFrMat = cvCreateMat(pFrame-height, pFrame-width, CV_32FC1);

pFrameMat = cvCreateMat(pFrame-height, pFrame-width, CV_32FC1);

//转化成单通道图像再处理

cvCvtColor(pFrame, pBkImg, CV_BGR2GRAY);

cvCvtColor(pFrame, pFrImg, CV_BGR2GRAY);

cvConvert(pFrImg, pFrameMat);

cvConvert(pFrImg, pFrMat);

cvConvert(pFrImg, pBkMat);

//二值化前景图

cvThreshold(pFrMat, pFrImg, 60, 255.0, CV_THRESH_BINARY);

不知道你说的什么意思,要对一个图像进行二值化处理用OpenCV的话就是

void cvThreshold( const CvArr* src, CvArr* dst, double threshold,

double max_value, int threshold_type );

这个函数是定阈值二值化处理,比较粗略吧。另外可以用自适应阈值二值化,那样的话就会比这个更精细。

如何利用Python做简单的验证码识别

最近在折腾验证码识别。最终的脚本的识别率在92%左右,9000张验证码大概能识别出八千三四百张左右。好吧,其实是验证码太简单。下面就是要识别的验证码。

?

我主要用的是Python中的PIL库。

首先进行二值化处理。由于图片中的噪点颜色比较浅,所以可以设定一个阈值直接过滤掉。这里我设置的阈值是150,像素大于150的赋值为1,小于的赋为0.

def set_table(a):

table = []

for i in range(256): ? ? ? ?if i a:

table.append(0) ? ? ? ?else:

table.append(1) ? ?return table

img = Image.open("D:/python/单个字体/A"+str(i)+".jpg")

pix = img.load()#将图片进行灰度化处理img1 = img.convert('L')#阈值为150,参数为1,将图片进行二值化处理img2 = img1.point(set_table(150),'1') ?1234567891011121314151617

处理后的图片如下。

阈值不同产生的不同效果:

?

接下来对图片进行分割。遍历图片中所有像素点,计算每一列像素为0的点的个数(jd)。对于相邻两列,若其中一列jd=0,而另一列jd!=0,则可以认为这一列是验证码中字符边界,由此对验证码进行分割。这样分割能达到比较好的效果,分割后得到的字符图片几乎能与模板完全相同。

(Width,Height) = img2.size

pix2 = img2.load()

x0 = []

y0 = []for x in range(1,Width):

jd = 0

# print x

for y in range(1,Height): ? ? ? ?# print y

if pix2[x,y] == 0:

jd+=1

y0.append(jd) ? ?if jd 0:

x0.append(x)#分别对各个字符边界进行判断,这里只举出一个 ? ? ? ?for a in range(1,Width): ? ?if (y0[a] != 0)(y0[a+1] != 0):

sta1 = a+1

break123456789101112131415161718192021

分割完成后,对于识别,目前有几种方法。可以遍历图片的每一个像素点,获取像素值,得到一个字符串,将该字符串与模板的字符串进行比较,计算汉明距离或者编辑距离(即两个字符串的差异度),可用Python-Levenshtein库来实现。

我采用的是比较特征向量来进行识别的。首先设定了4个竖直特征向量,分别计算第0、2、4、6列每一列像素值为0的点的个数,与模板进行比较,若小于阈值则认为该字符与模板相同。为了提高识别率,如果通过竖直特征向量未能识别成功,引入水平特征向量继续识别,原理与竖直特征向量相同。

另外,还可以通过局部特征进行识别。这对于加入了旋转干扰的验证码有很好效果。由于我写的脚本识别率已经达到了要求,所以并没有用到这个。

最后的结果是这样的:

最终在模板库只有25条的情况下,识别率在92%左右(总共测试了一万六千张验证码)。好吧,只能说验证码太简单。。

以上。

python怎么用PIL模块处理BMP图像 二值化

用PIL载入BMP格式图像之后 进行灰度处理 可是 返回值是

PIL.Image.Image image mode=L size=1280x960 at 0x3034F98

并不是像素点的值

因为我想对这个图像进行 二值化处理

写了 一段

image = Image.open('E:\\0.2.bmp').convert("L")

for i in image:

if i 125:

i=255

else:

i=0

可是 并不成功 错误是 TypeError: 'Image' object is not iterable

遍历图片对象?可是怎么个遍历法呢?Pillow 提供了一个 .load() 方法,用来处理像素。图片嘛,当然是二维的,有宽和高的。

pixels = image.load()

for x in ramge(image.width):

for y in range(image.height):

pixsels[x, y] = 255 if pixsels[x, y] 125 else 0

当然了,只是最简单的二值化的话,直接 image.convert('1') 就可以了 :-)

(责任编辑:IT教学网)

更多