qt画个灰度直方图
步驟
我下面為什么引用了 Qt:OpenCV::Mat與Qt::QImage相互轉(zhuǎn)換 的知識(shí)呢。。。因?yàn)橐婚_始我參考的例程導(dǎo)入的是qimage的圖片。我覺得mat可能好用一點(diǎn)。。。。結(jié)果發(fā)現(xiàn)我不用轉(zhuǎn),直接把圖片導(dǎo)入成mat格式來用就好了,我個(gè)憨憨。
void MainWindow::graydata(QCustomPlot * plot, Mat img) {double yrange=0;QVector<double>datax;QVector<double>datay;plot->clearGraphs();datay.resize(256);//向量擴(kuò)容到256并填充為0 用來計(jì)數(shù)for (double i=0;i<256;i++) {datax.push_back(i);//x向量填0 1 ……255 作為橫坐標(biāo)}//QImage countimg=img->copy();unsigned char* data=img.data;//bits()直接返回圖像第一個(gè)字節(jié)的地址int width = img.rows-50;int hight = img.cols-50;//圖像邊緣隨手隔了50個(gè)像素不讀for (int i=50;i<hight;i++) {for (int j=50;j<width;j++) {datay[data[i*hight+j]]+=1;}}//y軸最大值QVector<double>::iterator it;for (it=datay.begin();it!=datay.end();it++) {if(*it>yrange)yrange=*it;}plot->xAxis->setRange(-5,260);plot->yAxis->setRange(0,(int)yrange);QCPBars *bars=new QCPBars(plot->xAxis,plot->yAxis);bars->setData(datax,datay);bars->setPen(QColor(0,0,0));plot->replot(); }QImage::Format這個(gè)方法可以查詢圖片的顏色類型
Qt:OpenCV::Mat與Qt::QImage相互轉(zhuǎn)換
假設(shè)存在一個(gè) 3\times3 的圖像,如下圖所示,數(shù)組x 統(tǒng)計(jì)的是像素點(diǎn)的灰度級(jí),數(shù)組y
統(tǒng)計(jì)的是具有該灰度級(jí)的像素個(gè)數(shù)。其中,灰度為1的像素共3個(gè),灰度為2的像素共1個(gè),灰度為3的像素共2個(gè),灰度為4的像素共1個(gè),灰度為5的像素共2個(gè)。
數(shù)字圖像處理(15): 灰度直方圖(matplotlib 和OpenCV
繪制直方圖)
QCustomPlot簡(jiǎn)單介紹和例程
qt超強(qiáng)精美繪圖控件 - QCustomPlot一覽 及 安裝使用教程
下面兩個(gè)鏈接 第一個(gè)說qimage格式有對(duì)齊,mat格式不用對(duì)齊
第二個(gè)說 mat格式基本上不用對(duì)齊,但是也有需要對(duì)齊的時(shí)候。。。
把QImage轉(zhuǎn)換為cv::Mat
例如保存BMP格式的圖像時(shí),BMP要求圖像數(shù)據(jù)按四字節(jié)對(duì)齊,此時(shí)就需要對(duì)Mat中的數(shù)據(jù)進(jìn)行補(bǔ)零
對(duì)齊方法就是在每一行尾部補(bǔ)零,零的個(gè)數(shù)可能是1~3個(gè)
但其實(shí)大部分時(shí)候,Mat的內(nèi)存都是連續(xù)的,只有極個(gè)別時(shí)候需要擔(dān)心這個(gè)問題,這里有說明,和這里
【學(xué)習(xí)OpenCV】Mat::data指針
總結(jié)
- 上一篇: 基于SSM的家庭财务管理系统
- 下一篇: 【Python 每日一技】文本查找和替换