比较简单,已基本满足我的需求。留了两个参数可调,根据不同需求来调节,我的是调的20,0.51就够了。测试了几百张图OK。

/** sparseDense.h*   实验开始,第一次人工停止对焦的图片,判断样液浓度是否不符合要求*  是否太密,太密软件会报警要求稀释样液。*  Created on: 2019年10月10日*      Author: root wangdan*      version:V1.0.0*/#ifndef SRC_SPARSEDENSE_H_
#define SRC_SPARSEDENSE_H_#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/imgproc.hpp>using namespace std;
using namespace cv;class sparseDense {
public:sparseDense();virtual ~sparseDense();/*input:inputbgra--输入图像,人工“停止对焦”那一刻的图像*      windowsize-局部距离值的窗口,越小,疏密判断越准确,但不能太小,建议20*        thresh-----太密的局部区域占所有局部区域的比,大于此值报警太密,建议0.55*output:-1--------输入图像有问题,空图*         0--------浓度符合要求(不密)。*         1--------浓度过密,软件报警。* */int calculateSparseDense(unsigned char *image_pointer,int windowsize,double &thresh);private:int imgrows;int imgcols;Mat inputbwimg;int lastrows;int lastcols;//距离图每20x20计算一个最频繁的距离值,局部距离值的窗口//越小,疏密判断越准确,但不能太小,>=10;建议=20int winsize;//winsizexwinsize窗口内,最频繁的距离值>distanthresh,那么此窗口不密;否则过密//越大表示希望仪器希望接受的程度偏稀;越小表示仪器希望接受更密程度 distanthresh=winsizeint distanthresh;int fillholeCalcDistance(vector<int> &maxvalues);
};#endif /* SRC_SPARSEDENSE_H_ */
#include "sparseDense.h"sparseDense::sparseDense() {// TODO Auto-generated constructor stubimgrows=2048;imgcols=2448;
//  Mat inputbwimg;lastrows=imgrows/4;lastcols=imgcols/4;winsize=20;distanthresh=winsize;
}int sparseDense::calculateSparseDense(unsigned char *image_pointer,int windowsize,double &thresh)
{winsize=windowsize;distanthresh=windowsize;if(image_pointer==NULL){return -1;}Mat inputbgra(imgrows,imgcols,CV_8UC4);size_t primary_size_=imgrows*imgcols*4*sizeof(uchar);memcpy(inputbgra.data,image_pointer,primary_size_);Mat inputgray,inputbw;cv::cvtColor(inputbgra,inputgray,CV_BGRA2GRAY);cv::threshold(inputgray,inputbw,120,255,THRESH_BINARY_INV);cv::Size lastsize;lastsize.height=lastrows;lastsize.width=lastcols;resize(inputbw, inputbwimg, lastsize);vector<int> maxsvalues;fillholeCalcDistance(maxsvalues);int satisfynumber=0;int localmax=maxsvalues.size();for(int idx=0;idx!=localmax;idx++){satisfynumber+=maxsvalues[idx];}double ratio=double(satisfynumber)/localmax;//cout<<"ratio is: "<<ratio<<endl;if(ratio>thresh){return 1;//太密,报警}return 0;
}int sparseDense::fillholeCalcDistance(vector<int> &maxvalues)
{std::vector<std::vector<cv::Point> > contours;std::vector<Vec4i> hierarchy;findContours(inputbwimg, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE);Mat bwlast=Mat::zeros(lastrows,lastcols,CV_8UC1);for (int idx = 0; idx != (int)contours.size(); idx++){drawContours(bwlast, contours, idx, Scalar(255), CV_FILLED);}//imwrite("bw.jpg",bwlast);cv::bitwise_not(bwlast,inputbwimg);//imwrite("bwnot.jpg",inputbwimg);Mat distance;distanceTransform(inputbwimg, distance, CV_DIST_L2, 3);//距离图每25x25计算一个局部最大值,图像共有N个局部最大值int maxsidxr=1;while(maxsidxr*winsize<lastrows){int maxsidxc=1;while(maxsidxc*winsize<lastcols){//统计当前局部方块的距离值int numlocal=winsize*winsize;int localdistance[numlocal]={0};for(int r=(maxsidxr-1)*winsize;r!=maxsidxr*winsize;r++){for(int c=(maxsidxc-1)*winsize;c!=maxsidxc*winsize;c++){int current=int(distance.ptr<float>(r)[c]);if(current>0 && current<numlocal){localdistance[current]+=1;}}}//当前局部方块距离值主要集中在哪个区间int maxdistsum=0,maxdist=0;for(int idx=0;idx!=numlocal;idx++){if(localdistance[idx]>maxdistsum){maxdistsum=localdistance[idx];maxdist=idx;}}//当前局部最大值计算完毕//cout<<maxdist<<" ";//当前局部最大值如果大于阈值,证明此局部是比规定浓度还稀,符合要求;//否则,此局部比规定浓度密,不符合要求;int isdense=0;int notsparse=1;if(maxdist<distanthresh){maxvalues.push_back(notsparse);}else{maxvalues.push_back(isdense);}//移到此行下一列方块maxsidxc++;}//cout<<endl;//列所有局部最大值计算完毕maxsidxr++;}//行所有局部最大值计算完毕return 0;
}sparseDense::~sparseDense() {// TODO Auto-generated destructor stub
}

测试了几百张图片,各种形状各种大小的目标的图像,发现判断还比较准确。

但是有一个前提,图像中的目标一定要比较均匀,不能图像的左下角密密麻麻而另外四分之三图像都没目标,这种极度不均匀的情况是不行的,不能作为输入图像。因为我们判断一个试管中样液是否浓或稀,一定要摇晃均匀才看整体浓或稀。反正就是目标可以有不同形状不同大小,但输入图像不能极度不均匀。输入图像整体越均匀,那么算法判断越准确。

  小不点的美图。

图像中目标or内容疏密程度判断相关推荐

  1. 图像中目标的绝对位置信息(2)--Global Pooling, More than Meets the Eye: Position Information is Encoded Channel-

    关于偶数卷积核和padding的副作用可以参考这个博客. 首先,本文是翻译了 ICCV 2021的一篇文章:Global Pooling, More than Meets the Eye: Posit ...

  2. Opencv学习记录(三) —— 得到图像中目标物坐标的简单处理算法(望指正与补充)

    先描述一下使用场景: 我要识别一个红灯,已经把目标准确的提取出来了,二值图像中白色为目标物,现在要算出二值图中的白色像素点的坐标.因为之后需要移植到树莓派,所以需要高效的方法.             ...

  3. python 傅立叶函数_python-如何从图像中去除高频内容以进行傅立叶逆变换

    我在opencv中看到几个文档对此进行了解释,但是我的目标是使用numpy&卑鄙的 我想我必须用某种圆形来遮盖频谱的外部区域,因为我用60×60矩形遮盖了频谱的中心以进行低频滤波.但我不知道如 ...

  4. 全球首个大规模虐童图像数据库!标记15万图像、20类信息,自动判断图片是否违法​...

    NEW 关注剁手日记视频号 最新视频→[暮云白版DJI Pocket 2来啦] 来源|大数据文摘 文|Mickey 去年3月份,韩国N号房一事被曝光,黑产集团用裸照威逼利诱女性.幼童,对受害者实施性剥 ...

  5. matlab实现大气湍流退化模型算法,大气湍流下退化序列图像的目标检测方法

    引言 目标检测是计算机视觉的重要应用之一, 是后续目标识别.跟踪.目标分类以及行为分析的前提.远距离成像时通常会受到复杂变化的大气湍流影响, 使得成像结果中存在不规则抖动.偏移和模糊等退化现象[.因此 ...

  6. ITK:删除一个未连接到其边界的二进制图像中的孔

    ITK:删除一个未连接到其边界的二进制图像中的孔 内容提要 输出结果 C++实现代码 内容提要 删除一个未连接到其边界的二进制图像中的孔.在这种情况下,图像的前景值为零(黑色),并且所有内容均填充在黑 ...

  7. ITK:用颜色标记图像中的区域

    ITK:用颜色标记图像中的区域 内容提要 输出结果 C++实现代码 内容提要 用颜色标记图像中的区域 输出结果 C++实现代码 #include "itkBinaryImageToLabel ...

  8. ITK:从图像中提取轮廓

    ITK:从图像中提取轮廓 内容提要 输出结果 C++实现代码 内容提要 从图像中提取轮廓. 输出结果 There are 2 contoursContour 0: [10.5, 19] [10.460 ...

  9. ITK:自定义操作以对应两个图像中的像素

    ITK:自定义操作以对应两个图像中的像素 内容提要 输出结果 C++实现代码 内容提要 对两个图像中的相应像素应用预定义的操作. 输出结果 pixel1 was = 2 pixel2 was = 5 ...

最新文章

  1. 增强型固态硬盘支持人工智能工作负载
  2. ios与html数据交互,iOS iOS与html进行交互
  3. caffe源码c++学习笔记
  4. 征战蓝桥 —— 2016年第七届 —— C/C++A组第4题——快速排序
  5. 各种快速幂(qaq)
  6. 利用ptrace和memfd_create混淆程序名和参数
  7. 在Linux上安装ant环境
  8. 记录用NoteExpress下载文献全文成功
  9. JavaEE JavaSE JavaME的区别
  10. keil5 字符编码的问题
  11. 信息论领域内的计算方法仿真,Mutual Information,互信息;
  12. 【小白必读】机器学习入门须知
  13. 时间复杂度与大O记法的理解
  14. 小猿圈Java学习分享2019Java面试题
  15. IDEA 自动下载依赖jar包
  16. 8个方法让你游戏防封
  17. 概率论笔记1.1.3事件间的关系
  18. 服务器c盘清理文件,云服务器c盘满了怎么清理
  19. 在人脸识别、机器视觉中USB免驱摄像头拍照颜色不对怎么办?大影30~1600万像素多种摄像头方案通过一次白平衡解决偏色问题。
  20. 汽车理论课后习题matlab程序,汽车理论课后作业matlab编程详解(带注释).doc

热门文章

  1. 物联网开发笔记(64)- 使用Micropython开发ESP32开发板之控制ILI9341 3.2寸TFT-LCD触摸屏进行LVGL图形化编程:控件显示
  2. 冯诺依曼体系结构与操作系统的概念及理解
  3. python strftime时分秒_Python time.strftime()用法及代碼示例
  4. 从流水线工人,到谷歌上班的程序媛,一位湖南娄底妹子的励志故事...
  5. Liunx wget命令
  6. python二级证书考试难度_全国计算机等级考试 python二级考试体验及小技巧总结...
  7. 分支定界法 python_分支定界(Branchbound)算法
  8. Unity后处理效果之边角压暗
  9. 海思hi3516dv300音频调节总结
  10. 【AI达人创造营三期-Antigen Detector(新冠试剂盒检测)部署】