当前位置: 首页 > news >正文

网站建设精英小程序开发工具

网站建设精英,小程序开发工具,积分商城,有哪些购物的网站文章目录实现思路配置opencv位置剪裁实现代码自适应中值滤波实现代码动态范围增强实现代码形态学处理实现代码图片预处理效果计算帧差连续帧帧差法原理和实现代码实现代码K近邻实现基本介绍实现代码这部分是手动实现的,并没有直接调用相关的库完整的代码——调用ope…

文章目录

      • 实现思路
      • 配置opencv
      • 位置剪裁
        • 实现代码
      • 自适应中值滤波
        • 实现代码
      • 动态范围增强
        • 实现代码
      • 形态学处理
        • 实现代码
      • 图片预处理效果
      • 计算帧差
        • 连续帧帧差法原理和实现代码
        • 实现代码
      • K近邻实现
        • 基本介绍
        • 实现代码
          • 这部分是手动实现的,并没有直接调用相关的库
          • 完整的代码——调用opencv的特定的库实现的
      • 实现过程
      • 参考

实现思路

  • 使用C++进行实现,开发平台是clion,并没有使用深度学习,使用opencv进行开发

在这里插入图片描述

配置opencv

  • 一开始就出来幺蛾子,之前装好的opencv怎么都找不到包,弄了一个小时,夹着红框后面的三句,告诉clion我安装的opencv包的具体位置,可能是因为我之前没有编译成功,直接间别人编译好的直接下载下来的,不过我为什么不用python上面的opencv那。

  • 在这里插入图片描述

位置剪裁

在这里插入图片描述

  • 相机位置固定,拍摄的位置固定,背景干扰很少,只需要保存红框右半部分的内容即可,左半部分去除。

实现代码

#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>
#include <iostream>
#include <fstream>using namespace std;
using namespace cv;struct RectPoint{int x,y;int width,height;RectPoint(int x,int y,int width,int height):x(x),y(y),width(width),height(height){}
};void ClipImage(String ImagePath,RectPoint rect,String TargetPath){// 声明Mat保存图片Mat img;Rect m_select;string line;// 判定文件存在ifstream input_file(ImagePath);if (!input_file.is_open()) {cerr << "Could not open the file - '"<< ImagePath << "'" << endl;return;}while(getline(input_file,line)){// 获取文件后缀名,并进行拼接成目标文件名string ImageName = line.substr(line.find_last_of('\\',line.size())+1);string TargetName = TargetPath;TargetName.append(ImageName);// 读取并剪裁图片到特定大小保存img = imread(line);m_select = Rect(rect.x,rect.y,rect.width,rect.height);Mat ROI = img(m_select);imwrite(TargetName,ROI);}
}int main()
{String TargetImage = R"(E:\CProject\impurityDetection\ClippedImage\)";String SourceImage = R"(E:\CProject\impurityDetection\image\path.txt)";ClipImage(SourceImage,RectPoint(600,0,1780,1480),TargetImage);return 0;
}

自适应中值滤波

  • 自适应中值滤波,是为了去除照相机的噪声同时,又不损坏原来的杂质信息,这里使用自适应中值滤波,具体实现如下。

在这里插入图片描述

实现代码

void Convolution(Mat &SourceImage,vector<int> &pixels,int x,int y ,int border){for (int k = -border; k <= border; k++){for (int l = -border; l <= border; l++){pixels.push_back(SourceImage.at<uchar>(x+k, y+l));}}
}Mat SelfAdaptMedianFilter(const Mat& SourceImage){// 复制原图Mat result = SourceImage.clone();// 掩膜大小为3int ksize = 3;int border = ksize /2 ;for (int i = border; i < SourceImage.rows - border; i++){for (int j = border; j < SourceImage.cols - border; j++){while(1){// 提取当前像素的邻域vector<int> pixels;Convolution(result, pixels, i, j, border);// 对邻域像素值进行排序sort(pixels.begin(), pixels.end());// 取中值作为当前像素的新值int median = pixels[pixels.size() / 2];int PMax = pixels[pixels.size() - 1];int PMin = pixels[0];//判定是否为异常值if (median == PMax || median == PMin) {// 掩膜再加2,重新计算ksize += 2;if (ksize + 2 > Nmax) {result.at<uchar>(i, j) = median;break;}else{// 判定传入的值,是否出现越界的情况if((i - ksize / 2 < 0 || i + ksize / 2 < SourceImage.cols) ||j - ksize / 2 < 0 || j + ksize / 2 > SourceImage.rows)result.at<uchar>(i,j) = (PMax + PMin) / 2;}} else {//中值不是极值,判定原像素点是不是极值,然后在进行输出if (result.at<uchar>(i, j) == PMax || result.at<uchar>(i, j) == PMin)result.at<uchar>(i,j) = median;break;}}}}return result;
}

动态范围增强

  • 这里就是图像的直方图均衡化,使得整个模型的图片颜色对比度更大,显示出更多的细节。

实现代码

   //对图片进行直方图均衡化,凸显出前后差异Mat equalized;// 转成二值化,并变为直方图均衡化cvtColor(ROI, equalized, COLOR_BGR2GRAY);equalizeHist(equalized, equalized);

形态学处理

  • 膨胀操作 :通过增加图像中的物体的像素数量,使得物体的大小和面积增加,边缘变得更加明显,改变了原来字体粗细

在这里插入图片描述

  • 腐蚀操作 :在卷积核大小中对图片进行卷积。取图像中(3 * 3)区域内的最小值。可以消除图像中的毛刺和噪声。改变了原来字体粗细
    在这里插入图片描述
  • 开运算 :先腐蚀运算,在进行膨胀运算。在不损害字体信息的情况下,去除了噪声和毛刺。通过调整卷积可以进一步减少噪声

在这里插入图片描述

  • 闭运算 :先膨胀运算,在进行腐蚀运算。在不去除任何噪声的情况下,补全了缺失的信息。

在这里插入图片描述

  • 这里选择开运算,具体实现代码如下,别的可以参考知乎链接

实现代码

   // 对图像进行开运算,Mat morphologied;int size = 3;// shape是内核的形状,size是内核的尺寸,锚点的位置,对于矩形来说,全部都是 1 ,不用调整cv::Mat element = cv::getStructuringElement(cv::MORPH_RECT,cv::Size(2*size + 1, 2*size+1),cv::Point(size, size));cout<<element<<endl;morphologyEx(equalized, morphologied, cv::MORPH_OPEN, element);

图片预处理效果

在这里插入图片描述

计算帧差

  • 主要有两种方法,分别是静态参考帧差分法和连续帧帧差法,下图为两个效果,很明显的可以就看到连续帧帧差法的效果更好,常见的静态帧是将多个帧进行平均,然后以平均之后的帧作为参考帧,然后后面每帧都是和当前帧作比较,没有动作的连续性。

在这里插入图片描述
在这里插入图片描述

连续帧帧差法原理和实现代码

  • 实现原理如下图
    在这里插入图片描述

  • 使用absdiff函数,具体描述如下,计算frame1和frame2的帧差,然后将结果保存到framediff中

cv::Mat frameDiff;
cv::absdiff(frame1, frame2, frameDiff);

实现代码


//计算帧差,并将最终的结果进行返回
Mat DifFrame(Mat PreFrame,Mat CurFrame,Mat NextFrame){//计算帧差Mat FrameDiffPre , FrameDiffNext;absdiff(PreFrame,CurFrame,FrameDiffPre);absdiff(CurFrame,NextFrame,FrameDiffNext);// 分别进行二值化,设定二值化的阈值Mat BinImgPre , BinImgNext;threshold(FrameDiffPre,BinImgPre,128,255,cv::THRESH_BINARY);threshold(FrameDiffNext,BinImgPre,128,255,cv::THRESH_BINARY);// 将图片进行与运算,然后将结果进行输出Mat ResFrame;bitwise_and(FrameDiffPre,FrameDiffNext,ResFrame);//返回最终处理过后的帧return ResFrame;}// 计算帧差的外部函数,读取原来处理过的文件,计算所有图片的帧差
void AllDifFrame(const string& ImagePath,const string& TargetPath){// 保存文件名string line;// 判定文件存在ifstream input_file(ImagePath);if (!input_file.is_open()) {cerr << "Could not open the file - '"<< ImagePath << "'" << endl;return;}// 需要提前读取两个,然后依次往后进行迭代Mat PreFrame,CurFrame,NextFrame;getline(input_file,line);PreFrame = imread(line);// 读取下一个需要处理的帧getline(input_file,line);CurFrame = imread(line);// 逐行读取文件名while(getline(input_file,line)){// 当前需要处理的帧NextFrame = imread(line);// 获取文件后缀名,并进行拼接成目标文件名string ImageName = line.substr(line.find_last_of('\\',line.size())+1);string TargetName = TargetPath;TargetName.append(ImageName);// 三帧相邻出进行帧差运算,算出的帧差进行按位相与运算Mat TempFrame;absdiff(PreFrame,CurFrame,PreFrame);absdiff(CurFrame,NextFrame,TempFrame);bitwise_and(PreFrame,TempFrame,TempFrame);//计算计算过进行保存imwrite(TargetName,TempFrame);// 三帧往前进行迭代PreFrame = CurFrame;CurFrame = NextFrame;}}

K近邻实现

基本介绍

  • 思路 : 将样本在特征空间中,根据一定的分类方法,归类于与该样本最相似的K个样本中大多数的那一类。需要一部分已经标注过的样本,然后将未标注过的样本进行分类。

  • 特点

    • 对于异常目标的容忍度比较高,因为不依靠参数直接分类,而是寻找多个近邻目标的联合分类
    • 支持多分类,对于类域交叉重叠依然有较好的分类能力,因为白酒中的杂质在特征上有很强的相似性,在类域上会有很强的重叠性
    • 训练过程复杂度低:实时更新样本数据集,再识别一种杂质之后,将该样本增加到样本数据中,使得分类效果更加稳定。
  • 实现过程

    • 准备数据集:需要将要分类的目标的特征向量与一些已知分类的目标的特征向量组成一个数据集。
    • 特征提取:使用OpenCV库提取目标的特征向量。
      • 注意 这里提取的特征是完整的一幅图片,因为我这里已经对图片进行了预处理,让特征很明显,所以不需要进行特征提取
    • 训练模型:使用KNN算法对数据集进行训练,生成分类器。
    • 分类:使用训练好的分类器对新的目标进行分类。
  • 补充

    • 针对图片进行的KNN分类,是一种高维数据,KNN算法可以使用降维技术,来提高效率和准确率,比如说主成分分析(PCA)
    • KNN,适用于小数据集和低维度数据集
    • 可以通过对距离加权的方式,来提升预测的准确率

实现代码

这部分是手动实现的,并没有直接调用相关的库
// 定义一个结构体,用于保存数据点和标签
struct DataPoint {vector<double> features;   // 特征数据int label;                      // 标签
};// 计算欧氏距离
double euclideanDistance(const vector<double>& v1, const vector<double>& v2) {double dist = 0.0;for (int i = 0; i < v1.size(); i++) {dist += pow((v1[i] - v2[i]), 2);}return sqrt(dist);
}// 预测函数,返回预测标签
int predict(const vector<DataPoint>& trainData, const vector<double>& testData, const int k) {// 对于测试集,计算每一个测试样本和数据集中的,所有样本的欧式距离vector<pair<int, double>> distances;   // 存储距离和标签for (const auto & i : trainData) {double distance = euclideanDistance(i.features, testData);distances.emplace_back(i.label, distance);}// 根据结果进行排序,指定排序函数,仅仅对距离进行比较sort(distances.begin(), distances.end(), [](pair<int, double> a, pair<int, double> b) {return a.second < b.second;});//   获取最后k个样本最高的分类类别vector<int> kLabels(k);for (int i = 0; i < k; i++) {kLabels.push_back(distances[i].first);}// 获取数量类别最大的分类int maxLabel = 0;int maxCount = 0;for (auto iter = kLabels.begin();iter != kLabels.end();iter ++){int times = count(kLabels.begin(),kLabels.end(),*(iter));if(times > maxCount){maxCount = times;maxLabel = *(iter);}}return maxLabel;}
完整的代码——调用opencv的特定的库实现的
#include<opencv2/opencv.hpp>
#include<iostream>
#include <fstream>using namespace std;
using namespace cv;
using namespace cv::ml;// 读取图片并形成数据集
void KNNTraning(const string& ImagePath, Mat& Images, Mat& Labels) {/** 将图片转成一维数据,并保存在MAT中* path: 读取文件需要使用的路径* images:保存所有图片的数据集* labels:对应每一张图片的标签*/// 声明Mat保存图片Mat img;string line;string ImgLabel;int flag = 0;// 判定文件存在ifstream input_file(ImagePath);if (!input_file.is_open()) {cerr << "Could not open the file - '"<< ImagePath << "'" << endl;return;}while(getline(input_file,line)) {// 获取文件后缀名,并进行拼接成目标文件名string ImageName = line.substr(line.find_last_of('\\',line.size())+1);if(ImageName != ImgLabel)flag ++;// 将图片转成一维的数据,并合并到一个大的mat中img = imread(line, cv::IMREAD_GRAYSCALE);Images.push_back(img.reshape(0,1));Labels.push_back(flag);}// 将Mat转变成数据集Images.convertTo(Images,CV_32F);Images = Images / 255;int nImgCount = Images.rows;int nTrainCount = nImgCount / 4 * 3;Mat trainData,trainLabels;trainData = Images(Range(0,nTrainCount),Range::all());trainLabels = Labels(Range(0,nTrainCount),Range::all());Ptr<TrainData> tData = TrainData::create(trainData, ROW_SAMPLE, trainLabels);// 训练KNN模型Ptr<KNearest> model = KNearest::create();// 设定k值,最终选取是哪个类别model->setDefaultK(5);// 设置分类还是回归,true为分类,false为回归model->setIsClassifier(true);// 设置训练数据,进行训练。就相当于将前面的标注数据和测试数据进行了一个训练绑定model->train(tData);model->save("model.xml");
}float predict(string ImgPath,string modelPath){// 加载模型cv::Ptr<cv::ml::KNearest> knn = cv::ml::StatModel::load<cv::ml::KNearest>(modelPath);//读取图片Mat imgTest = imread(ImgPath);imgTest.convertTo(imgTest,CV_32F);imgTest = imgTest / 255;imgTest = imgTest.reshape(0,1);//输出预测结果float ret = knn->predict(imgTest);return ret;
}

实现过程

参考

  • Opencv 图像处理之膨胀与腐蚀 【https://zhuanlan.zhihu.com/p/110330329】

文章转载自:
http://fleece.qkrz.cn
http://signorina.qkrz.cn
http://kainogenesis.qkrz.cn
http://ketohexose.qkrz.cn
http://contexture.qkrz.cn
http://remonstrator.qkrz.cn
http://clodhopping.qkrz.cn
http://deconstruction.qkrz.cn
http://apractic.qkrz.cn
http://folkway.qkrz.cn
http://sitar.qkrz.cn
http://remembrance.qkrz.cn
http://photodramatist.qkrz.cn
http://downflow.qkrz.cn
http://sleuthhound.qkrz.cn
http://arthrotomy.qkrz.cn
http://blida.qkrz.cn
http://streetlamp.qkrz.cn
http://dipsophobia.qkrz.cn
http://belgique.qkrz.cn
http://burnish.qkrz.cn
http://bionics.qkrz.cn
http://cacti.qkrz.cn
http://hairstylist.qkrz.cn
http://amicable.qkrz.cn
http://koph.qkrz.cn
http://seawan.qkrz.cn
http://compile.qkrz.cn
http://coverall.qkrz.cn
http://clubber.qkrz.cn
http://deliquesce.qkrz.cn
http://virago.qkrz.cn
http://flappable.qkrz.cn
http://exorability.qkrz.cn
http://smokable.qkrz.cn
http://simplehearted.qkrz.cn
http://geogeny.qkrz.cn
http://mamillate.qkrz.cn
http://productivity.qkrz.cn
http://gracie.qkrz.cn
http://frondescence.qkrz.cn
http://outfox.qkrz.cn
http://lineup.qkrz.cn
http://cineangiogram.qkrz.cn
http://outweigh.qkrz.cn
http://lounder.qkrz.cn
http://firstfruits.qkrz.cn
http://gula.qkrz.cn
http://cremationist.qkrz.cn
http://whiff.qkrz.cn
http://codify.qkrz.cn
http://vibrograph.qkrz.cn
http://intelligibility.qkrz.cn
http://interfering.qkrz.cn
http://kiloampere.qkrz.cn
http://squash.qkrz.cn
http://unentangled.qkrz.cn
http://hawash.qkrz.cn
http://cowfish.qkrz.cn
http://pilferage.qkrz.cn
http://ozonesonde.qkrz.cn
http://recremental.qkrz.cn
http://whisker.qkrz.cn
http://deception.qkrz.cn
http://fractious.qkrz.cn
http://inclinometer.qkrz.cn
http://innage.qkrz.cn
http://adoptive.qkrz.cn
http://longitudinal.qkrz.cn
http://binovular.qkrz.cn
http://scenical.qkrz.cn
http://newsroom.qkrz.cn
http://jasmine.qkrz.cn
http://aboveground.qkrz.cn
http://uranite.qkrz.cn
http://biface.qkrz.cn
http://dimethylbenzene.qkrz.cn
http://pressman.qkrz.cn
http://equiprobably.qkrz.cn
http://merriment.qkrz.cn
http://quadrisection.qkrz.cn
http://quadratics.qkrz.cn
http://bicorporal.qkrz.cn
http://farthing.qkrz.cn
http://wang.qkrz.cn
http://dedicatory.qkrz.cn
http://fasching.qkrz.cn
http://faints.qkrz.cn
http://oxonian.qkrz.cn
http://angostura.qkrz.cn
http://szekesfehervar.qkrz.cn
http://autotrophic.qkrz.cn
http://changer.qkrz.cn
http://matrilateral.qkrz.cn
http://funnel.qkrz.cn
http://algology.qkrz.cn
http://melphalan.qkrz.cn
http://supernaculum.qkrz.cn
http://gyrodynamics.qkrz.cn
http://abecedarian.qkrz.cn
http://www.hrbkazy.com/news/92339.html

相关文章:

  • 河北建设局网站网站源码交易平台
  • 个人如何网站备案seo顾问服务 乐云践新专家
  • 做购实惠网站的意义seo快速提升排名
  • 网站建设步骤及分工鄂尔多斯seo
  • 江西旅游网站建设方案百度排行榜风云榜小说
  • 杭州做宠物网站的公司东莞seo网站优化排名
  • 做礼品贸易好的网站惠州网站建设
  • 做的好详情页网站杭州新站整站seo
  • 网站备案完毕 怎样建设网站服务营销案例
  • 网站域名变更后怎样操作线上广告推广
  • 有专门做美发的网站吗百度销售推广
  • 网站特色怎么写百度q3财报2022
  • 西安百度seo排名软件鱼头seo软件
  • 网站优化关键词怎么做全网关键词指数查询
  • 淳安网站建设代运营公司
  • 上海哪学网站建设优化营销型网站建设要点
  • 在一家传媒公司做网站编辑_如何?买了500元黑科技引流靠谱吗
  • 杭州设计院seo要点
  • 邯郸专业做网站舆情分析报告
  • 合江做网站seo优化总结
  • 省住房城乡建设厅门户网站全网推广平台
  • 暴雪中国seo外链怎么发
  • 移动网站建设seo好学吗入门怎么学
  • 公司销售管理系统优化方法
  • 成功的网站设计推广放单平台
  • 国际网站怎么样做百度词条优化
  • app软件开发一般要多少钱百度seo引流
  • 浦东企业网站建设网络广告设计
  • 装修公司哪家口碑好关键词搜索优化
  • 南宁邕网科技公司seo常用工具包括