文档章节

图像二值化(迭代法,C语言实现)

t
 tigerBin
发布于 2017/07/25 22:23
字数 389
阅读 49
收藏 0

1. 随机确定一个初始阈值 k1 = 127(可以为随机值【0,255】)

2. 根据阈值k1把原始图像分为两部分(小于 k1 的像素部分,大于k1的背景部分),并分别求其均值avgPix, avgBac

3. 计算新的阈值 k2 = (avgPix + avgBac) / 2

4. 判断 k1 与 k2 是否相等,如果不等,则更新k1, 重新执行步骤2-3 直到 k1 == k2

5. 根据计算得到的阈值 k1 (或 k2) 对图像进行二值化


#include "JpegDecoder.h"
#include <stdio.h>
#include <opencv2/highgui.hpp>
#include <math.h>

using namespace JpegCodec;

static cv::Mat ConvertToMat(Matrix &mat)
{
	int channel = CV_8UC3;
	if (mat.channal == 1) channel = CV_8UC1;

	cv::Mat img(mat.rows, mat.cols, channel);  // create a new matrix

	for (int i = 0; i < mat.rows * mat.cols * mat.channal; i++)
	{
		img.data[i] = mat.data[i];
	}

	return img;
}


void ShowImage(Matrix &mat)
{
	cv::Mat img = ConvertToMat(mat);
	cv::imshow("Bitmap", img);
}


// 二值化
void Binary(Matrix &mat)
{
	int k1 = 127, k2 = 0;
	int cnt = mat.rows * mat.cols * mat.channal;

	// 计算阈值
	while (k1 != k2)
	{
		k2 = k1;
		int avgPix = 0;
		int avgBac = 0;
		int size = 0;
		for (int i = 0; i < cnt; i++)
		{
			if (mat.data[i] < k2)
			{
				avgPix += mat.data[i]; // 像素数据
				size++;
			}
			else 
				avgBac += mat.data[i]; // 背景数据
		}

		// 计算像素阈值 与 背景阈值
		avgPix /= size;
		avgBac /= (cnt - size);
		// 计算 k1
		k1 = (avgPix + avgBac) / 2;
	}

	// 二值化
	for (int i = 0; i < cnt; i++)
	{
		if (mat.data[i] < k1) mat.data[i] = 0;
		else mat.data[i] = 255;
	}
}


// 灰度化
void Gray(Matrix &dst, Matrix &src)
{
	dst.Create(src.rows, src.cols, 1);

	for (int i = 0; i < src.rows; i++)
	{
		for (int j = 0; j < src.cols; j++)
		{
			int idx = (i * src.rows + j) * 3;
			dst.data[idx / 3] = (src.data[idx] + src.data[idx + 1] + src.data[idx + 2]) / 3;
		}
	}
}


int main(int argc, char *arrv[])
{
	JpegDecoder decoder("01.jpg");
	Matrix mat, dst;
	decoder.Decoder(mat);

	Gray(dst, mat);
	Binary(dst);
	ShowImage(dst);

	cvWaitKey(0);
	return 0;
}

JpegDecoder: https://github.com/lzb-cc/JpegCodecs

 

运行示例

© 著作权归作者所有

共有 人打赏支持
t
粉丝 0
博文 65
码字总数 17440
作品 0
武汉
程序员
OpenCV学习(14) 细化算法(2)

前面一篇教程中,我们实现了Zhang的快速并行细化算法,从算法原理上,我们可以知道,算法是基于像素8邻域的形状来决定是否删除当前像素。还有很多与此算法相似的细化算法,只是判断的条件不一...

迈克老狼1
2013/09/15
0
0
Java基于opencv实现图像数字识别(二)—基本流程

Java基于opencv实现图像数字识别(二)—基本流程 做一个项目之前呢,我们应该有一个总体把握,或者是进度条;来一步步的督促着我们来完成这个项目,在我们正式开始前呢,我们先讨论下流程。 ...

奇迹迪
06/10
0
0
手写数字识别系统之图像分割

背景 本文,主要介绍我之前在学校时候,研究的一些跟手写数字识别相关的技术心得,主要涉及:数字图像处理、特征提取、神经网络等等相关的一些技术。。 虽然很多用到的还是网上现有的比较成熟...

ruki
2016/07/30
184
0
图像的灰度图 和 二值化的概念

原文地址 在图像处理中,用RGB三个分量(R:Red,G:Green,B:Blue),即红、绿、蓝三原色来表示真彩色,R分量,G分量,B分量的取值范围均为0~255,比如电脑屏幕上的一个红色的像素点的三个...

liuhongyi0104
03/23
0
0
大津法---OTSU算法

OpenCV的二值化操作中,有一种“大津阈值处理”的方法,使用函数cvThreshold(image,image2,0,255,CVTHRESH_OTSU) 实现,该函数就会使用大律法OTSU得到的全局自适应阈值来进行二值化图片,而参...

moki_oschina
2016/11/24
13
0

没有更多内容

加载失败,请刷新页面

加载更多

关于Excel表格导出方法--application/vnd.ms-excel

关于Excel表格导出方法--application/vnd.ms-excel 由于本人所做的项目中需要用到两种将JSP页面table导出到Excel表格的方法(老板也是坑爹),一种是在后台操作数据库来实现,比较简单。由于...

DemonsI
25分钟前
2
0
springboot配置读写分离

我不提供内容,我只是好文章的搬运工 https://www.cnblogs.com/wuyoucao/p/9610882.html

颖辉小居
29分钟前
2
0
Spring 传参

spring传参之@RequestParam注解 @RequestParam注解有三个参数分别是: value、 required、 defaultValue 代码: @RequestMapping(value="test1", method = RequestMethod.GET) public String......

休辞醉倒
30分钟前
2
0
go http 框架性能大幅下降原因分析

最近在开发一个web 框架,然后业务方使用过程中,跟我们说,压测qps 上不去,我就很纳闷,httprouter + net/http.httpserver , 性能不可能这么差啊,网上的压测结果都是10w qps 以上,几个m...

鼎铭
31分钟前
11
0
GCC编译过程记

GCC编译过程记 一、引言 对于编程工作者来说,GCC是一个熟悉的名字,它的全称是“GNU Compiler Collection”。GCC是一组编译器集合,目前其支持C、C++、Objective-C、Objective-C++、Go和RBI...

珲少
32分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部