博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
图像二值化(直方图法,C语言实现)
阅读量:6071 次
发布时间:2019-06-20

本文共 2139 字,大约阅读时间需要 7 分钟。

hot3.png

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

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

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

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

#include "JpegDecoder.h"#include 
#include
#include
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://my.oschina.net/tigerBin/blog/1486966

你可能感兴趣的文章
遇到过有人在文件服务器上新建共享文件夹,自己无法COPY文件,别人无法看到的情况么??...
查看>>
iOS开发系列—Objective-C之Foundation框架
查看>>
LLDB TO GDB COMMAND MAP LLDB TO GDB COMMAND MAP[转]
查看>>
js修改后没反应-看看是不是取的缓存
查看>>
将图库的图片剪切并保存
查看>>
Bootstrap
查看>>
HTTP请求(GET与POST区别)和响应
查看>>
深入理解Linux内存管理机制(一)
查看>>
如何创建可扩展表视图中的iOS 学习和拓展优化(有待更新)
查看>>
ubuntu下如何安装codeblocks集成开发环境
查看>>
IOS 6 自动布局 入门-1(IOS中autolayout和之前版本autoresize的差异)
查看>>
Perl快捷删除数组重复元素
查看>>
java设计模式4--建造者模式(Builder)
查看>>
[Domino]“java.lang.ClassCastException:lotus.domino.cso.Item”异常解决办法
查看>>
java String转Date问题
查看>>
[华为机试练习题]26.铁路栈问题
查看>>
Android popupWindow打造一个扩展性强的的抽象BasePopup类
查看>>
一分钟了解阿里云产品:数据集成概述
查看>>
HTML5贪吃蛇源码
查看>>
容器环境下的持续集成最佳实践:构建基于 Drone + GitFlow + K8s 的云原生语义化 CI 工作流...
查看>>