[问题]opencv calcHist计算与画直方图的问题

楼主: LGham (老大叉)   2017-07-27 16:45:25
开发平台(Platform): (Ex: Win10, Linux, ...)
win7
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
c++
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
opencv
问题(Question):
在使用calcHist做直方图的计算时以整张图来做计算及画图是OK的
但想要更精确表示图像的话必须将图块切块后(EX:3*3)再将各区块的直方图连接起来
做为整张图的特征直方图 我用了阿洲的程式教学里的方式做运算
但只能做单一整张的直方图 不知有无方式可以绘制出连接后的直方图呢
谢谢大家
喂入的资料(Input):
预期的正确结果(Expected Output):
错误结果(Wrong Output):
程式码(Code):(请善用置底文网页, 记得排版)
#include <cstdio>
#include <opencv2/opencv.hpp>
using namespace cv;
void drawHistImg(const Mat &src, Mat &dst);
int main(){
Mat src = imread("lena.jpg",CV_LOAD_IMAGE_GRAYSCALE);
int histSize = 256;
float range[] = {0, 255} ;
const float* histRange = {range};
Mat histImg;
calcHist(&src, 1, 0, Mat(), histImg, 1, &histSize, &histRange);
Mat showHistImg(256,256,CV_8UC1,Scalar(255)); //把直方图秀在一个256*256大
的影像上
drawHistImg(histImg, showHistImg);
imshow("window1", src);
imshow("window2", showHistImg);
waitKey(0);
return 0;
}
void drawHistImg(const Mat &src, Mat &dst){
int histSize = 256;
float histMaxValue = 0;
for(int i=0; i<histSize; i++){
float tempValue = src.at<float>(i);
if(histMaxValue < tempValue){
histMaxValue = tempValue;
}
}
float scale = (0.9*256)/histMaxValue;
for(int i=0; i<histSize; i++){
int intensity = static_cast<int>(src.at<float>(i)*scale);
line(dst,Point(i,255),Point(i,255-intensity),Scalar(0));
}
}
补充说明(Supplement):
作者: longlongint (华哥尔)   2017-07-28 21:57:00
直接画整张直方图?请问连接是什么意思
楼主: LGham (老大叉)   2017-07-29 09:44:00
比如说把整张图切成9块 个别计算直方图 再将九个直方图连接起来
作者: waterCoka (Coka)   2017-07-29 13:10:00
请搜寻local histogram equalization
作者: longlongint (华哥尔)   2017-07-30 14:10:00
直方图是256根棒子 连起来要做什么 变成更多棒子?
楼主: LGham (老大叉)   2017-07-30 15:49:00
分区块再连接起来这样特征会比较明显
作者: Raymond0710 (雷门)   2017-07-31 06:52:00
用pushback

Links booklink

Contact Us: admin [ a t ] ucptt.com