文档章节

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

t
 tigerBin
发布于 2017/07/25 15:15
字数 309
阅读 140
收藏 0

图像二值化就是将【0,255】之间的灰度数据通过门限值(K)变换为{0,255}的一个数据集合

最简单的方法是取值 K = 127,简单粗暴

或者取值 K = avg(pixels) (像素平均值)


#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;
}


////方案一 K = 127
//void Binary(Matrix &mat)
//{
//	for (int i = 0; i < mat.rows * mat.cols * mat.channal; i++)
//	{
//		if (mat.data[i] < 127) mat.data[i] = 0;
//		else mat.data[i] = 255;
//	}
//}


//// 方案二 K = avg(pixels)
//void Binary(Matrix &mat)
//{
//	int avg = 0;
//	int cnt = mat.rows * mat.cols * mat.channal;
//	for (int i = 0; i < cnt; i++)
//	{
//		avg += mat.data[i];
//	}
//	avg = avg / cnt;
//
//	for (int i = 0; i < cnt; i++)
//	{
//		if (mat.data[i] < avg) mat.data[i] = 0;
//		else mat.data[i] = 255;
//	}
//}


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


// 图像灰度化
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

 

运行示例

灰度图

K = 127

K = avg(pixels)

© 著作权归作者所有

共有 人打赏支持
t
粉丝 0
博文 62
码字总数 17049
作品 0
武汉
程序员
大津法---OTSU算法

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

moki_oschina
2016/11/24
13
0
手写数字识别系统之图像分割

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

ruki
2016/07/30
184
0
手写数字识别系统之数字提取

引言 所谓数字分割就是指将经过二值化后的图像中的单个数字区域进行提取的过程。数字分割在数字识别中是一个必不可少的关键步骤,只有能够将数字进行准确的提取,才能将其一一识别。 数字分割...

ruki
2016/07/30
39
0
【数字图像处理】七.MFC图像增强之图像普通平滑、高斯平滑、Laplacian、Sobel、Prewitt锐化详解

本文主要讲述基于VC++6.0 MFC图像处理的应用知识,主要结合自己大三所学课程《数字图像处理》及课件进行讲解,主要通过MFC单文档视图实现显示BMP图像增强处理,包括图像普通平滑、高斯平滑、...

Eastmount
2015/06/08
0
0
图片灰度化原理与实现(java)

24位彩色图与8位灰度图 首先要先介绍一下24位彩色图像,在一个24位彩色图像中,每个像素由三个字节表示,通常表示为RGB。通常,许多24位彩色图像存储为32位图像,每个像素多余的字节存储为一...

守望者-圣堂刺客
2016/02/26
285
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

qduoj~前端~二次开发~打包docker镜像并上传到阿里云容器镜像仓库

上一篇文章https://my.oschina.net/finchxu/blog/1930017记录了怎么在本地修改前端,现在我要把我的修改添加到部署到本地的前端的docker容器中,然后打包这个容器成为一个本地镜像,然后把这...

虚拟世界的懒猫
今天
1
0
UML中 的各种符号含义

Class Notation A class notation consists of three parts: Class Name The name of the class appears in the first partition. Class Attributes Attributes are shown in the second par......

hutaishi
今天
1
0
20180818 上课截图

小丑鱼00
今天
1
0
Springsecurity之SecurityContextHolderStrategy

注:下面分析的版本是spring-security-4.2.x,源码的github地址是: https://github.com/spring-projects/spring-security/tree/4.2.x 先上一张图: 图1 SecurityContextHolderStrategy的三个......

汉斯-冯-拉特
今天
1
0
LNMP架构(Nginx负载均衡、ssl原理、生成ssl密钥对、Nginx配置ssl)

Nginx负载均衡 网站的访问量越来越大,服务器的服务模式也得进行相应的升级,比如分离出数据库服务器、分离出图片作为单独服务,这些是简单的数据的负载均衡,将压力分散到不同的机器上。有时...

蛋黄_Yolks
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部