数字图像处理-实验2

news/2024/11/15 9:43:34/文章来源:https://www.cnblogs.com/Nartsam/p/18417558

实验E2:图像代数运算

实验2.1:对比度调整

设计一个Sigmoid函数,实现对图像的对比度调整,并使得调整幅度可以通过参数控制;

通过查阅资料得知,Sigmoid函数的标准形式为:

其中,

x 表示输入的像素值,并且可以归一化到[0,1]范围内。

k 表示的是控制对比度调整幅度的参数,k 值越大,图像的对比度越高;k 值越小,对比度越低。

x0 参数用来调整Sigmoid函数的中心点,通过查阅资料可知该参数的值一般取 0.5 。

 

据此编写出Sigmoid函数的代码:

inline float sigmoid(float x,float k,float x0){return 1.0/(1.0+exp(-k*(x-x0)));
}

利用Sigmoid函数调整图像对比度的代码如下:

cv::Mat contrast_adjust(const cv::Mat& src,float k,float x0){cv::Mat dst=cv::Mat::zeros(src.size(),src.type());for(int i=0;i<src.rows;++i){for(int j=0;j<src.cols;++j) {for (int c=0;c<src.channels();++c) {//归一化到[0,1]float pixel=src.at<cv::Vec3b>(i,j)[c]/255.0;float adjusted=sigmoid(pixel,k,x0);//映射回[0,255]dst.at<cv::Vec3b>(i,j)[c]=cv::saturate_cast<uchar>(adjusted*255);}}}return dst;
}

测试结果如下:

当k=3,x0=0.5时,原图(上)和调整后的图片(下)的对比如下:

当k=80,x0=0.4时,图像的对比如下:

 

实验2.2:背景相减

•对图像I和对应的背景图B,基于背景相减检测I中的前景区域,并输出前景的mask.

•分析你的方法可能产生误检的情况,并上网查阅背景相减的改进方法,设法改进结果。

•测试数据见群文件bgs-data.zip

首先能够自然而然地想到一种朴素的方法:遍历前景图和背景图中的每一个点,计算对应像素点的每一种颜色数值之间的差的平方和,即它们之间的欧氏距离。如果这个距离小于某个阈值那么就认为这两个像素之间是一样的,并在结果图中去掉这个像素点。利用这个朴素算法进行背景相减的实验代码如下:

int main(int argc,char *argv[]){cv::Mat fimg=cv::imread("2-2_f.png");cv::Mat bimg=cv::imread("2-2_b.png");if(fimg.empty()||bimg.empty()||fimg.rows!=bimg.rows||fimg.cols!=bimg.cols){std::cout<<"Illegal Input!"; return 0;}cv::Mat res=cv::Mat::zeros(fimg.size(),fimg.type());for(int i=0;i<fimg.rows;++i){for(int j=0;j<fimg.cols;++j){double dis=0; //距离for(int k=0;k<3;++k){dis+=std::pow(fimg.at<cv::Vec3b>(i,j)[k]-bimg.at<cv::Vec3b>(i,j)[k],2);}if(dis<5000) res.at<cv::Vec3b>(i,j)={0,0,0};else res.at<cv::Vec3b>(i,j)=fimg.at<cv::Vec3b>(i,j);}}cv::imshow("output",res);cv::waitKey(0);cv::destroyAllWindows();return 0;
}

当阈值分别取100,1000,5000,10000时,实验结果如下:

可以看到,朴素算法的处理结果中要么去除不干净背景,要么就连背景和需要保留的人一起去除了,总之效果不是太好。

因此又去寻找有关背景相减的改进算法,了解到了一种比较通用的处理算法:

仔细研究后发现这个方法好像和我的朴素算法基本一样,因此又尝试在这个算法的基础上进行改进。想到可以对每一个像素点和它周围的几个像素点做平均,利用平均后的值再进行上面的步骤,这次的实验结果如下:

实验代码
 int main(int argc,char *argv[]){cv::Mat fimg=cv::imread("2-2_f.png");cv::Mat bimg=cv::imread("2-2_b.png");if(fimg.empty()||bimg.empty()||fimg.rows!=bimg.rows||fimg.cols!=bimg.cols){std::cout<<"Illegal Input!"; return 0;}cv::Mat res=cv::Mat::zeros(fimg.size(),fimg.type());int max_step=1;int dx[]={-1,-1,0,1,1,1,0,-1},dy[]={0,1,1,1,0,-1,-1,-1};for(int i=0;i<fimg.rows;++i){for(int j=0;j<fimg.cols;++j){double dis=0; //距离cv::Vec3b avg=bimg.at<cv::Vec3b>(i,j);//std::cout<<avg<<"|";int avg_cnt=1;for(int step=1;step<=max_step;++step){for(int twd=0;twd<8;++twd){int ni=i+dx[twd]*step,nj=j+dy[twd]*step;if(ni<0||ni>=fimg.rows||nj<0||nj>=fimg.cols) continue;++avg_cnt;avg+=bimg.at<cv::Vec3b>(ni,nj);}}avg=avg/avg_cnt;//std::cout<<avg<<std::endl;cv::Vec3b avgf=fimg.at<cv::Vec3b>(i,j);//std::cout<<avg<<"|";int avg_cntf=1;for(int step=1;step<=max_step;++step){for(int twd=0;twd<8;++twd){int ni=i+dx[twd]*step,nj=j+dy[twd]*step;if(ni<0||ni>=fimg.rows||nj<0||nj>=fimg.cols) continue;++avg_cntf;avgf+=fimg.at<cv::Vec3b>(ni,nj);}}avgf=avgf/avg_cntf;for(int k=0;k<3;++k){dis+=std::pow(avgf[k]-avg[k],2);}if(dis<1) res.at<cv::Vec3b>(i,j)={0,0,0};else res.at<cv::Vec3b>(i,j)=fimg.at<cv::Vec3b>(i,j);}}cv::imshow("output",res);cv::waitKey(0);cv::destroyAllWindows();return 0;
}

可以看到,效果还是不理想。

之后又想到了一种优化方法:在朴素算法计算完成后再对结果图遍历一遍,对每个像素点计算它周围有多少个被删除了的点和有多少个没被删除的点,如果被删除的点的比例高于某个阈值,就把它也删除掉;如果它周围没被删除的点的比例高于某个阈值,就把前景图中对应点的像素赋给它。此方法的实验代码如下:

bool del_map[5000][5000],rec_map[5000][5000];
int main(int argc,char *argv[]){cv::Mat fimg=cv::imread("2-2_f.png");cv::Mat bimg=cv::imread("2-2_b.png");if(fimg.empty()||bimg.empty()||fimg.rows!=bimg.rows||fimg.cols!=bimg.cols){std::cout<<"Illegal Input!"; return 0;}cv::Mat res=cv::Mat::zeros(fimg.size(),fimg.type());for(int i=0;i<fimg.rows;++i){for(int j=0;j<fimg.cols;++j){double dis=0; //距离for(int k=0;k<3;++k){dis+=std::pow(fimg.at<cv::Vec3b>(i,j)[k]-bimg.at<cv::Vec3b>(i,j)[k],2);}if(std::sqrt(dis)<100) res.at<cv::Vec3b>(i,j)={0,0,0};else res.at<cv::Vec3b>(i,j)=fimg.at<cv::Vec3b>(i,j);}}cv::imshow("ori",res);int max_step=10;int dx[]={-1,-1,0,1,1,1,0,-1},dy[]={0,1,1,1,0,-1,-1,-1};double erase_rate=0.1,recover_rate=0.2;for(int i=0;i<fimg.rows;++i){for(int j=0;j<fimg.cols;++j){int tot=0,del_cnt=0;for(int step=1;step<=max_step;++step){for(int twd=0;twd<8;++twd){int ni=i+dx[twd]*step,nj=j+dy[twd]*step;if(ni<0||ni>=fimg.rows||nj<0||nj>=fimg.cols) continue;++tot;if(res.at<cv::Vec3b>(ni,nj)==cv::Vec3b{0,0,0}) ++del_cnt;}}if(del_cnt*1.0/tot>=erase_rate) del_map[i][j]=true;if((tot-del_cnt)*1.0/tot>=recover_rate) rec_map[i][j]=true;}}for(int i=0;i<fimg.rows;++i){for(int j=0;j<fimg.cols;++j){if(del_map[i][j]) res.at<cv::Vec3b>(i,j)={0,0,0};if(rec_map[i][j]) res.at<cv::Vec3b>(i,j)=fimg.at<cv::Vec3b>(i,j);}}cv::imshow("output",res);cv::waitKey(0);cv::destroyAllWindows();return 0;
}

当阈值取100,删除比例取0.1,恢复比例取0.2时,原方法(左)和改进方法(右)的效果如下:

可以看到,优化后的方法在效果上对比原方法还是有一定的改进的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/798789.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何修改URL命名规则 让他更适合Google SEO优化

为了使URL更符合Google的SEO优化标准,您可以遵循以下原则来修改您的URL命名规则:简洁明了:URL应该尽可能短小,避免冗长的路径。 使用有意义的单词而不是数字或不相关的短语。使用关键词:在URL中包含目标关键词可以帮助搜索引擎理解页面的内容。 但是避免过度堆砌关键词,这…

General error: 1366 Incorrect string value: \xF0\x9F\x98 for column content

错误信息 General error: 1366 Incorrect string value: \xF0\x9F\x98 for column content 表明插入的数据包含不正确的字符或编码问题。具体原因可能是:字符集不匹配:数据库表的字符集与应用中使用的字符集不一致。 字段类型不支持某些字符:VARCHAR 或 TEXT 类型字段可能不…

智能行为分析摄像头

智能行为分析摄像头主要采用了计算机视觉深度学习算法,利用现场已有的监控摄像头对现场监控画面当中的人员行为进行实时分析识别预警。智能行为分析摄像头可以实时分析个人行为,如:跌倒监测、抽烟识别、睡岗离岗识别、打电话识别、区域入侵识别、攀高识别、玩手机识别等。智…

工地视频监控行为分析

工地视频监控行为分析对监控范围人员行为如高空作业安全带穿戴识别、安全帽佩戴识别、反光衣识别、工装着装识别等。当工地视频监控行为分析检测出人员未按要求在作业时穿戴安全带、安全帽、反光衣、工装时,系统连接当场语音广播提醒并抓拍传给后台监控留档保存。工地视频监控…

工地AI视频行为分析系统

工地AI视频行为分析系统通过现场安装的监控摄像头对现场视频监控画面当中人员行为进行实时分析预警,工地AI视频行为分析系统在可以监测分析:安全帽佩戴识别、反光衣穿戴识别、抽烟识别、打电话识别、睡岗离岗识别、安全带佩戴识别、区域入侵识别、玩手机识别等,当系统检测到…

工地视频监控人员行为分析系统

工地视频监控人员行为分析系统利用现场已有的监控监控摄像头实时分析现场视频画面,视频监控人员行为分析系统对监控区域内的人员行为识别如:打电话、睡岗、跌倒、离岗、玩手机、异常徘徊、抽烟等行为进行识别,工地视频监控人员行为分析系统可进行现场物体状态检测:区域入侵…

人员行为智能分析系统

人员行为智能分析系统主要包含行为分析和特征识别。人员行为智能分析系统以机器学习+边缘计算视觉分析为依托,对人员徘徊、人员集聚、物件遗留、打架斗殴、跌倒检测、安全帽佩戴识别、反光衣识别、区域人数统计、火焰检测等多个方面。人员行为智能分析系统根据AI神经元网络视觉…

SQLSTATE[HY000]: General error: 1366 Incorrect string value: \xF0\x9F... for column content at row 1

错误信息 SQLSTATE[HY000]: General error: 1366 Incorrect string value: \xF0\x9F... for column content at row 1 表明插入的数据包含不正确的字符或编码问题。具体原因可能包括:字符集不匹配:数据库表的字符集与应用中使用的字符集不一致。 字段类型不支持某些字符:VAR…

高空作业安全绳穿戴识别系统

高空作业安全绳穿戴识别系统利用作业现场已有的摄像头,通过计算机视觉+视频ai分析技术,对高空作业人员进行实时监测。当高空作业安全绳穿戴识别系统检测出相关人员在高空作业未佩戴安全绳时,系统立即预警提醒,并把报警记录储存在服务器数据库中,同步将信息发到相关人员手机…

智慧工地安全帽抓拍系统

智慧工地安全帽抓拍系统可自动识别现场人员是不是戴安全帽,当智慧工地安全帽抓拍系统检测出未戴安全帽时,自动开启警报,提醒后台人员及时处理相关情况。智慧工地安全帽抓拍系统利用安装在工地现场的各类监控摄像头,创建智能ai视频监控分析系统,有效弥补传统方法和技术在监…

工地安全帽佩戴检测

工地安全帽佩戴检测利用深度学习和神经网络算法,对监控区域人员安全帽佩戴实时检测,当工地安全帽佩戴检测系统检测到有人未按要求佩戴安全帽,马上预警提醒,报警记录可展示在后台监控系统页面,还可以将报警记录传送到手机。工地安全帽佩戴检测系统全天候不间断实时分析,大…

工地安全绳穿戴识别系统

工地安全绳穿戴识别系统利用现场已经安好的监控摄像头(需对准监控位置)对监控视频画面开展实时监控分析,例如施工临边作业、洞口作业、工地攀登作业、工厂悬空作业和交叉作业等实时监控分析。工地安全绳穿戴识别系统一旦发现监控画面中相关人员并没有佩戴安全绳,系统会积极…