C++自写直方图(初学)

本文介绍了如何使用OpenCV库在C++环境中计算并绘制灰度图像的直方图。通过遍历图像像素,统计每个灰度级的像素数量,然后自适应缩放绘制直方图,最后展示直方图结果。示例代码中展示了从读取图像到显示直方图的完整流程。

 Opencv,C++环境下

初学,如有问题,可及时沟通交流

#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
void hist(Mat& src,int h,int w)
{
    int rows=src.rows;//图像的高
    int cols=src.cols;//图像的宽
    int N=rows*cols;//图像的大小
    long src_count[256];//每个像素对应的个数
    memset(src_count,0,sizeof(src_count));//对数组进行初始化为0
    //计算像素对应的个数
    for(int i=0;i<rows;i++)
    {
        uchar*p=src.ptr<uchar>(i);
        for(int j=0;j<cols;j++)
        {
            for(int k=0;k<256;k++)
               {
                   if((int)p[j]==k)
                    {
                       src_count[k]++;
                    }
                }
         }
     }
    //h //直方图的高
	//w //直方图的宽
	Mat src_hist = Mat::zeros(h+3, w+3, CV_8UC3);//直方图初始化,+3是为了防止像素0和255数量失真
	int c_max = 0;
	int c_min = 10000000;
    //比较每个像素对应个数得最大值,最小值
	for (int k = 0; k < 256; k++)
	{
		c_min = (c_min <= src_count[k]) ? c_min : src_count[k];
		c_max = (c_max >= src_count[k]) ? c_max : src_count[k];
	}
    //将像素个数的大小,(缩放)自适应至直方图的高
	for (int k = 0; k < 256; k++)
	{
		src_count[k] = h * (src_count[k] - c_min) / (c_max - c_min);
	}
    //将0-255(缩放)自适应至直方图的宽
	int x[256];
	for (int i = 0; i < 256; i++)
	{
		x[i] = w * i / 255;
	}
    //在直方图中画线
	for (int i = 0; i < 255; i++)
	{
		line(src_hist, Point(x[i], h - src_count[i]), Point(x[i + 1], h - src_count[i + 1]),Scalar(0,255,0), 1, LINE_AA);
	}
    //输出直方图
	imshow("src_hist_512*512", src_hist);
}

int main()
{
    Mat src=imread("Lena.jpg",0);
    imshow("src_512*512",src);
    hist(src,512,512);
    waitKey(0);
    return 0;
}

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

客官可满意

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值