作者LGham (老大叉)
看板C_and_CPP
标题opencv calcHist计算与画直方图的问题
时间Thu Jul 27 16:45:25 2017
开发平台(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):
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 140.116.40.159
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1501145128.A.545.html
1F:→ longlongint: 直接画整张直方图? 07/28 21:57
2F:→ longlongint: 请问连接是什麽意思 07/28 21:58
3F:→ LGham: 比如说把整张图切成9块 个别计算直方图 再将九个直方图连 07/29 09:44
4F:→ LGham: 接起来 07/29 09:44
5F:推 waterCoka: 请搜寻local histogram equalization 07/29 13:10
6F:→ longlongint: 直方图是256根棒子 连起来要做什麽 变成更多棒子? 07/30 14:10
7F:→ LGham: 分区块再连接起来这样特徵会比较明显 07/30 15:49
8F:推 Raymond0710: 用pushback 07/31 06:52