文档章节

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

t
 tigerBin
发布于 2017/07/25 15:25
字数 395
阅读 134
收藏 0
点赞 0
评论 0

1.首先构造像素的频率直方图

2. 寻找直方图中的两个最大的波峰

3. 寻找这两个波峰之间的最小的波谷

4.波谷的index(像素值)为 K 值(阈值)


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


typedef struct
{
	int index;
	int freq; // frequence
}Point;

void Binary(Matrix &mat)
{
	Point peaks[256]; // 波峰
	int histogram[256];     //直方图

	// 构造直方图
	for (int i = 0; i < 255; i++) histogram[i] = 0;
	int cnt = mat.rows * mat.cols * mat.channal;
	for (int i = 0; i < cnt; i++)
	{
		histogram[mat.data[i]] ++;
	}

	// 统计波峰
	int size = 0;
	for (int i = 1; i < 254; i++)
	{
		if (histogram[i] > histogram[i + 1] && histogram[i] < histogram[i - 1])
		{
			peaks[size].index = i;
			peaks[size].freq = histogram[i];
			size++;
		}
	}

	// 寻找最大的两个波峰
	Point max = peaks[0], snd = peaks[0];
	for (int i = 0; i < size; i++)
	{
		if (peaks[i].freq > max.freq)
		{
			snd = max;
			max = peaks[i];
		}
		else if (peaks[i].freq > snd.freq)
		{
			snd = peaks[i];
		}
	}

	// 寻找波谷
	int i = (max.index > snd.index ? snd.index : max.index);
	size = (max.index > snd.index ? max.index : snd.index);
	Point K = max;
	for (; i < size; i++)
	{
		if (histogram[i] < K.freq)
		{
			K.freq = histogram[i];
			K.index = i;
		}
	}

	//二值化
	for (i = 0; i < cnt; i++)
	{
		if (mat.data[i] < K.index) 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;
}

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

运行示例

© 著作权归作者所有

共有 人打赏支持
t
粉丝 0
博文 61
码字总数 16992
作品 0
武汉
程序员
(三)matlab数字图像处理实验-图像灰度变换处理

前两节都是熟悉一下怎么在matlab底下对图片做一些操作,并没有什么卵用,这一节稍微有点卵用,灰度变换一般是图像处理的第一步。 数字图像处理实验1-9点击下列链接有源码和链接: matlab数字...

aninstein ⋅ 01/06 ⋅ 0

图像的灰度图 和 二值化的概念

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

liuhongyi0104 ⋅ 03/23 ⋅ 0

灰度图像的阈值化

通过对灰度图像二值化处理,能够凸现出感兴趣目标的轮廓. 灰度图像的二值化处理就是讲图像上的点的灰度置为0或255,也就是讲整个图像呈现出明显的黑白效果。即将256个亮度等级的灰度图像通过适...

文艺小青年 ⋅ 2017/07/06 ⋅ 0

图像直方图与直方图均衡化

图像直方图(英语:Image Histogram)是用以表示数字图像中亮度分布的直方图,标绘了图像中每个亮度值的像素数。可以借助观察该直方图了解需要如何调整亮度分布。这种直方图中,横坐标的左侧...

Tony沈哲 ⋅ 2017/05/22 ⋅ 0

图像分析之直方图分析

图像分析之强度直方图分析 直方图介绍 强度直方图图形化显示不同的像素值在不同的强度值上的出现频率,对于灰度图像来说强度 范围为[0~255]之间,对于RGB的彩色图像可以独立显示三种颜色的强...

iamfish ⋅ 2012/04/22 ⋅ 0

【工具使用系列】关于 MATLAB 图像增强,你需要知道的事

如何进行图像增强 点处理增强 空域变换增强 直接灰度调整 全域线性变换 非线性灰度变换 直方图处理 直方图均衡化 图像间的代数运算 空域滤波增强 平滑滤波器 锐化滤波器 图像平滑 图像锐化 ...

AllenMoore ⋅ 01/27 ⋅ 0

手写数字识别系统之图像分割

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

ruki ⋅ 2016/07/30 ⋅ 0

尝试用OpenCV的模板匹配来定位和检测

1.OpenCV的模板匹配函数: 模板匹配的工作方式: 跟直方图的反向投影基本一样,大致过程是这样的:通过在输入图像image上滑动图像块,对实际的图像块和模板图像templ进行匹配。 假设我们有一...

cosmoshua ⋅ 2017/06/01 ⋅ 0

【OpenCV3.3】检测图像中的身份证区域

假设现有一些含身份证前景以及不确定背景的图像,想通过计算机将身份证区域检测出来,实现诸如用户拍照定位提示、背景分离等业务,用OpenCV该如何做呢?如果输入图像前景和背景同时具有一定区...

wjf1997 ⋅ 2017/08/16 ⋅ 0

局部二进制模式(Local Binary Patterns,LBP)——MATLAB实现

基本LBP: 逐行扫描图像,以图像中的每个像素点得灰度值为阈值,对其周围3*3的8邻域进行二值化,并从左上点开始按照顺时针方向(或逆时针,统一即可)将二值化结果组成一个二进制数,转换为十...

akadiao ⋅ 2017/07/07 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Centos7重置Mysql 8.0.1 root 密码

问题产生背景: 安装完 最新版的 mysql8.0.1后忘记了密码,向重置root密码;找了网上好多资料都不尽相同,根据自己的问题总结如下: 第一步:修改配置文件免密码登录mysql vim /etc/my.cnf 1...

豆花饭烧土豆 ⋅ 今天 ⋅ 0

熊掌号收录比例对于网站原创数据排名的影响[图]

从去年下半年开始,我在写博客了,因为我觉得业余写写博客也还是很不错的,但是从2017年下半年开始,百度已经推出了原创保护功能和熊掌号平台,为此,我也提交了不少以前的老数据,而这些历史...

原创小博客 ⋅ 今天 ⋅ 0

LVM讲解、磁盘故障小案例

LVM LVM就是动态卷管理,可以将多个硬盘和硬盘分区做成一个逻辑卷,并把这个逻辑卷作为一个整体来统一管理,动态对分区进行扩缩空间大小,安全快捷方便管理。 1.新建分区,更改类型为8e 即L...

蛋黄Yolks ⋅ 今天 ⋅ 0

Hadoop Yarn调度器的选择和使用

一、引言 Yarn在Hadoop的生态系统中担任了资源管理和任务调度的角色。在讨论其构造器之前先简单了解一下Yarn的架构。 上图是Yarn的基本架构,其中ResourceManager是整个架构的核心组件,它负...

p柯西 ⋅ 今天 ⋅ 0

uWSGI + Django @ Ubuntu

创建 Django App Project 创建后, 可以看到路径下有一个wsgi.py的问题 uWSGI运行 直接命令行运行 利用如下命令, 可直接访问 uwsgi --http :8080 --wsgi-file dj/wsgi.py 配置文件 & 运行 [u...

袁祾 ⋅ 今天 ⋅ 0

JVM堆的理解

在JVM中,我们经常提到的就是堆了,堆确实很重要,其实,除了堆之外,还有几个重要的模块,看下图: 大 多数情况下,我们并不需要关心JVM的底层,但是如果了解它的话,对于我们系统调优是非常...

不羁之后 ⋅ 昨天 ⋅ 0

推荐:并发情况下:Java HashMap 形成死循环的原因

在淘宝内网里看到同事发了贴说了一个CPU被100%的线上故障,并且这个事发生了很多次,原因是在Java语言在并发情况下使用HashMap造成Race Condition,从而导致死循环。这个事情我4、5年前也经历...

码代码的小司机 ⋅ 昨天 ⋅ 2

聊聊spring cloud gateway的RetryGatewayFilter

序 本文主要研究一下spring cloud gateway的RetryGatewayFilter GatewayAutoConfiguration spring-cloud-gateway-core-2.0.0.RC2-sources.jar!/org/springframework/cloud/gateway/config/G......

go4it ⋅ 昨天 ⋅ 0

创建新用户和授予MySQL中的权限教程

导读 MySQL是一个开源数据库管理软件,可帮助用户存储,组织和以后检索数据。 它有多种选项来授予特定用户在表和数据库中的细微的权限 - 本教程将简要介绍一些选项。 如何创建新用户 在MySQL...

问题终结者 ⋅ 昨天 ⋅ 0

android -------- 颜色的半透明效果配置

最近有朋友问我 Android 背景颜色的半透明效果配置,我网上看资料,总结了一下, 开发中也是常常遇到的,所以来写篇博客 常用的颜色值格式有: RGB ARGB RRGGBB AARRGGBB 这4种 透明度 透明度...

切切歆语 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部