OpenCV_用积分图像统计像素
来源:互联网 发布:vc ado access数据库 编辑:程序博客网 时间:2024/05/16 19:31
在累加多个图像区域的像素时,积分图像显得非常有用。
取图像左上侧的全部像素计算累加和,并用这个累加和替换图像中的每一个像素,用这种方式得到的图像称为积分图像。计算积分图像时只需要对图像扫描一次,这是因为当前积分值等于上一像素的积分值加上当前行的累计值。因此积分图像就是一个包含像素累加和的新图像。
*自适应的阈值化
通过对图像应用阈值来创建二值图像是从图像中提取有意义元素的好方法。
现在我随手拍张书本照片,如下:
当应用单一阈值时 ,结果是这样的:
代码:
int main(){cv::Mat image = cv::imread("book1.jpg");cv::cvtColor(image, image, CV_BGR2GRAY);cv::imshow("原图",image);cv::Mat binaryFixed;cv::threshold(image, binaryFixed, 150, 255, cv::THRESH_BINARY);cv::imshow("单一阈值结果", binaryFixed);cvWaitKey();}
自适应阈值化需要计算每个像素周围的局部平均值,可通过积分图像提高计算效率。
可以看出,自适应阈值比单一阈值的效果要好得多:
代码:
int main(){cv::Mat image = cv::imread("book1.jpg");cv::cvtColor(image, image, CV_BGR2GRAY);cv::imshow("原图", image);cv::Mat iimage;cv::Mat result;cv::integral(image, iimage, CV_32S);int blockSize = 21;//邻域尺寸int threshold = 8;int halfSize = blockSize / 2;for (int j = halfSize; j < iimage.rows - halfSize - 1; j++){uchar* data = image.ptr<uchar>(j);int* idata1 = iimage.ptr<int>(j - halfSize);int* idata2 = iimage.ptr<int>(j + halfSize + 1);for (int i = halfSize; i < iimage.cols - halfSize - 1; i++){int sum = (idata2[i + halfSize + 1] - idata2[i - halfSize] - idata1[i + halfSize + 1] + idata1[i - halfSize]) / (blockSize*blockSize);if (data[i] < (sum - threshold))data[i] = 0;elsedata[i] = 255;}}cv::imshow("自适应阈值结果", image);cvWaitKey();}
在OpenCV中也给出了自适应阈值化的函数cv::adaptiveThreshold()
除了在阈值化中使用局部平均值,还可以使用高斯(Gaussian)加权累计值(ADAPTIVE_THRESH_GAUSSIAN_C标志),这种实现方式比调用cv::adaptiveThreshold快一点
*直方图实现视觉追踪
有一种特殊情况,即由0和1组成的二值图像生成积分图像,这时的积分累计值就是指定区域内值为1 的像素总和。
此处已经研究了一天,代码仍是有误,先mark,回头看(问题出现在IngegralImage模板类的中符号重载函数的at函数)
IntegralImage模板类:
template<typename T, int N>class IntegralImage{cv::Mat integralImage;public:IntegralImage(cv::Mat image){cv::integral(image, integralImage, CV_32S);}cv::Vec<T, N> operator() (int xo, int yo, int width, int height){return (integralImage.at<cv::Vec<T, N>>(yo + height, xo + width)- integralImage.at<cv::Vec<T, N>>(yo + height, xo)- integralImage.at<cv::Vec<T, N>>(yo, xo + width)+ integralImage.at<cv::Vec<T, N>>(yo, xo));}};
int main(){cv::Mat image = cv::imread("bike.jpg");cv::Mat imageROI = image(cv::Rect(350, 76, 100, 100));cv::rectangle(image, cv::Rect(350, 76, 100, 100),0);cv::imshow("手动识别图", image);Histogram1D h;h.setNBins(16);cv::Mat refHistogram = h.getHistogram(imageROI);cv::Mat newImage = cv::imread("bike2.jpg");cv::imshow("待检测图像", newImage);//首先创建16个平面的二值图像cv::Mat planes;convertToBinaryPlanes(newImage, planes, 16);//然后计算积分图像IntegralImage<float, 16> intHistogram(planes);double maxSimilarity = 0.0;int xbest = 0, ybest = 0;double distance = 0;cv::Mat histogram;for (int y = 0; y < newImage.rows; y++){for (int x = 0; x < newImage.cols - 100; x++){histogram = intHistogram(x, y, 100, 100);distance = cv::compareHist(refHistogram, histogram, CV_COMP_INTERSECT);if (distance > maxSimilarity){xbest = x;ybest = y;maxSimilarity = distance;}}}cv::rectangle(newImage, cv::Rect(xbest, ybest, 100, 100), 0);cv::imshow("检测图像", newImage);cvWaitKey();}
阅读全文
0 0
- OpenCV_用积分图像统计像素
- OpenCV_用直方图统计像素
- OpenCV—使用积分图像统计像素
- 简单图像像素精确统计
- OpenCV_操作像素
- OpenCV_用类处理彩色图像
- OpenCV_用形态学运算变换图像
- opencv 二值化图像 像素统计 countNonZero
- 图像RGB个通道像素点统计
- opencv_图像预处理
- OpenCV_图像滤波
- OpenCV_图像旋转与缩放
- OpenCV_图像旋转与缩放
- 【opencv】统计图像二值化后白色像素点个数
- 用指针修改图像像素
- 积分图像
- 积分图像
- 积分图像
- TCP/IP详解
- 大数据Linux基本命令1
- WKWebView的使用和各种坑的解决方法(OC+Swift)
- nginx负载均衡session共享问题
- SpringMVC接收复杂集合参数
- OpenCV_用积分图像统计像素
- Educational Codeforces Round 33 (Rated for Div. 2) 893A. Chess For Three
- python基础-协程gevent用法、协程同步异步、协程socket并发例子
- 银行卡四要素验证补充测试
- 实战人品预测之一_国内大数据竞赛平台
- 码表的理解(ASCII,GBK,Unicode,UTF-8等)
- 深入阅读Mina源码(3) —— Mina之IOAdapter(二)
- 进程控制编程
- Android四大组件 BroadCasrReciver