图像二值化(直方图法,C语言实现)
2017-07-25 00:00
741 查看
1.首先构造像素的频率直方图
2. 寻找直方图中的两个最大的波峰
3. 寻找这两个波峰之间的最小的波谷
4.波谷的index(像素值)为 K 值(阈值)
JpegCodec : https://github.com/lzb-cc/JpegCodecs
运行示例
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
运行示例
相关文章推荐
- 打印字符频度直方图--C语言实现
- C语言实现的画直方图函数
- 打印字符频度直方图--C语言实现
- 求直方图中最大矩形面积(C语言实现)
- 图像二值化(迭代法,C语言实现)
- 图像二值化(均值法,C语言实现)
- 打印单词长度的直方图--C语言的多种实现
- C语言实现直方图统计和直方图均衡化
- 打印单词长度的直方图--C语言的多种实现
- c语言实现24位彩色图像二值化
- 散列表的插入和检索(c语言实现)
- C语言实现各类排序算法
- C语言实现linux pwd命令
- c语言 ---- HashMap实现
- c语言实现k-means算法
- 顺序表的实现--C语言泛型编程
- C语言求最大公约数(两种最简单的算法实现)
- 冒泡排序算法的c语言实现
- C语言实现某年某月某日是某年的第几天
- c语言实现ping