新手小菜菜求问opencv统计灰度图每个灰度级像素总数并输出,但是没有结果?

bearmomo 2017-10-26 02:51:45
加精
本意是有两幅图片,一个小的,一个大的,小的图片是大图片中一部分。
如图:


应该是统计像素pixcount那里有问题,但是找不出来。我献上我所有的分了,求帮助!

#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
int main()
{
Mat image = imread("test.jpg");
Mat image1 = imread("test1.jpg");
int width = image.cols;
int height = image.rows;
int width1 = image1.cols;
int height1 = image1.rows;
int pixelCount[256] = {0};
int pixelCount1[256] = {0};
float bizhi[256] = { 0 };
int i, j= 0;

//uchar* data = (uchar*)image.data;//uchar * data = image.ptr<uchar>(0)[0];

//Mat::ptr<>()=Mat::data
//统计灰度级中每个像素在整幅图像中的个数
Mat outputimage = image.clone();
for (i = 0; i < height; i++)
{
uchar * data = outputimage.ptr<uchar>(i);//获取第i行首地址
for (j = 0; j < width; i++)
{
pixelCount[data[j]]++;
}
}

Mat outputimage1 = image1.clone();
for (i = 0; i < height1; i++)
{
uchar * data1 = outputimage1.ptr<uchar>(i);//获取第i行首地址
for (j = 0; j < width1; i++)
{
pixelCount1[data1[j]]++;//data[j]=*(data+j)
}
}

//计算每个灰度级在整幅图像中的比例
uchar table[256] = {0};
for (i = 0; i < 256; i++)
{
if (pixelCount1[i]!=0)
{
bizhi[i] = (float)pixelCount[i] / (float)pixelCount1[i];
}
if (bizhi[i] < 0.5)
table[i] = 100;
else
table[i] = 0;
}
Mat lut(1, 256, CV_8U);
//为Mat矩阵添加元素值
uchar *p = lut.data;
for (int i = 0; i < 256; i++)
{
p[i] = table[i];
}
Mat dstImage;
dstImage.create(image.size(), image.type());
//查找表操作
LUT(image, lut, dstImage);
imshow("test", image);
imshow("test2", dstImage);
waitKey(0);
return 0;
}
...全文
9562 57 打赏 收藏 转发到动态 举报
写回复
用AI写文章
57 条回复
切换为时间正序
请发表友善的回复…
发表回复
xieyuan0217 2017-11-30
  • 打赏
  • 举报
回复
学习了学习了谢谢了。。。
星辰韦 2017-11-27
  • 打赏
  • 举报
回复
引用 楼主 bearmomo 的回复:
Mat image = imread("test.jpg");
首先读的都不是单通道的图,怎么能直接用呢
qq_29425957 2017-11-24
  • 打赏
  • 举报
回复
我是新手,请各位大侠多多指教。
NoEdUl 2017-11-20
  • 打赏
  • 举报
回复
引用 49 楼 bearmomo 的回复:
[quote=引用 48 楼 u012947309 的回复:] [quote=引用 5 楼 bearmomo 的回复:] for (i = 0; i < height; i++) { uchar * data = image.ptr<uchar>(i);//获取第i行首地址 for (j = 0; j < width; j++) { pixelCount[data[j]]++; } } for (i = 0; i <height1; i++) { uchar * data1 = image1.ptr<uchar>(i);//获取第i行首地址 for (j = 0; j <width1;j++) { pixelCount1[data1[j]]++;//data[j]=*(data+j) } } 我弄明白了 是把for内循环的j++写成i++了 但新的问题又出现了 第一幅图某一个灰度级计算出来的像素个数比第二张的多,很奇怪。。
两张图片除非百分百一样,灰度图才会一样。[/quote]我用的就是opencv鼠标截取功能,在一幅图片截取的两张保存为BMP格式的图片,你可以试试~ [/quote] 那还有什么试的。除非你说你两次鼠标截图一模一样框高和位置。 然后你存下来的BMP格式图一模一样大,不然出来的灰度统计要是一样了那才是小概率事件。
baidu_35838584 2017-11-20
  • 打赏
  • 举报
回复
这个厉害了,工作量复杂
bearmomo 2017-11-19
  • 打赏
  • 举报
回复
引用 48 楼 u012947309 的回复:
[quote=引用 5 楼 bearmomo 的回复:] for (i = 0; i < height; i++) { uchar * data = image.ptr<uchar>(i);//获取第i行首地址 for (j = 0; j < width; j++) { pixelCount[data[j]]++; } } for (i = 0; i <height1; i++) { uchar * data1 = image1.ptr<uchar>(i);//获取第i行首地址 for (j = 0; j <width1;j++) { pixelCount1[data1[j]]++;//data[j]=*(data+j) } } 我弄明白了 是把for内循环的j++写成i++了 但新的问题又出现了 第一幅图某一个灰度级计算出来的像素个数比第二张的多,很奇怪。。
两张图片除非百分百一样,灰度图才会一样。[/quote]我用的就是opencv鼠标截取功能,在一幅图片截取的两张保存为BMP格式的图片,你可以试试~
NoEdUl 2017-11-16
  • 打赏
  • 举报
回复
引用 5 楼 bearmomo 的回复:
for (i = 0; i < height; i++) { uchar * data = image.ptr<uchar>(i);//获取第i行首地址 for (j = 0; j < width; j++) { pixelCount[data[j]]++; } } for (i = 0; i <height1; i++) { uchar * data1 = image1.ptr<uchar>(i);//获取第i行首地址 for (j = 0; j <width1;j++) { pixelCount1[data1[j]]++;//data[j]=*(data+j) } } 我弄明白了 是把for内循环的j++写成i++了 但新的问题又出现了 第一幅图某一个灰度级计算出来的像素个数比第二张的多,很奇怪。。
两张图片除非百分百一样,灰度图才会一样。
  • 打赏
  • 举报
回复
xchstc829 2017-11-08
  • 打赏
  • 举报
回复
学习了学习了
cattpon 2017-11-08
  • 打赏
  • 举报
回复
learning~
赵4老师 2017-11-07
  • 打赏
  • 举报
回复
“多一少一”问题占程序员常犯错误的10%以上! 避免“多一少一”问题的方法之一是将比如<10甚至<5的数代入程序片断,掰手指头心算验证一下程序到底应该写为 x、x-1、x+1中的哪个? <、<=、==、>、>=中的哪个?
jiaomingfeng 2017-11-07
  • 打赏
  • 举报
回复
长见识了 谢谢。
  • 打赏
  • 举报
回复
a18027134657 2017-11-06
  • 打赏
  • 举报
回复
厉害啊我的哥
Xc4a 2017-11-06
  • 打赏
  • 举报
回复
长见识
schlafenhamster 2017-11-06
  • 打赏
  • 举报
回复
0~255 不是 256 个吗 ?
no6233470 2017-11-06
  • 打赏
  • 举报
回复
学到东西了!
wsdmw160720 2017-11-05
  • 打赏
  • 举报
回复
学习学习
shortree 2017-11-05
  • 打赏
  • 举报
回复
学习一下,谢谢
Tonykku 2017-11-05
  • 打赏
  • 举报
回复
灰阶度不是0~255吗?怎么会256?
加载更多回复(31)
一、主要内容:OpenCV能够实现强大丰富的图像处理,但是它缺少一个能够支持它运行的界面。Csharp经过多年的发展,得益于它的“所见及所得”能力,非常方便编写界面。这两者如果能够“双剑合璧”,将有效帮助实际工作产出。本课着重推荐GOCW采用“Csharp基于CLR直接调用Opencv编写的算法库”方法,能够将最新的OpenCV技术引入进来,同时保证生成程序的最小化。    为了进一步说明Csharp和OpenCV的结合使用,首先一个较为完整的基于winform实现答题卡识别的例子,相比较之前的实现,本次进一步贴近生产实际、内涵丰富,对算法也进行了进一步提炼。同时我们对WPF下对OpenCV函数的调用、OpenCV.js的调用进行相关教授。       二、课程结构1、 EmguCV、OpenCVSharp和GOCW之间进行比较(方便代码编写、能够融入最新的算法、速度有保障、方便调试找错、拒绝黑箱化);2、视频采集模块的构建,视频采集和图像处理之间的关系;3、视频采集专用的SDK和“陪练”系统的介绍;4、在视频增强类项目中和图像处理项目中,算法的选择;5、Csharp界面设计、图片的存储和其他构建设计;6、较为完整的答题卡识别例子,兼顾界面设计和算法分析;8、WPF基于GOCW也同样可以基于GOCW实现算法调用;webForm虽然也可以通过类似方法调用,但是OpenCV.JS的方法更现代高效。9、关于软件部署的相关要点和窍门。       三、知识要点:1、基本环境构建和程序框架;2、CLR基本原理和应用方法;3、接入、采集、模拟输入;4、图像处理,通过构建循环采集图片;5、增强和实时处理;6、基于投影等技术的答题卡识别算法;7、存储、转换;8、部署交付。        课程能够帮助你掌握Csharp调用Opencv的基本方法,获得相应框架代码和指导;从而进一步提升实现“基于图像处理”的解决方案能力。  

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧