图像处理之SVD检测显示屏缺陷(C++)

图像处理之SVD检测显示屏缺陷(C++)


文章目录

  • 图像处理之SVD检测显示屏缺陷(C++)
  • 前言
  • 一、SVD算法简介
  • 二、代码实现
  • 总结


前言

显示屏缺陷检测是机器视觉领域的一处较广泛的应用场景,显示屏主要有LCD和OLED,缺陷类型主要包括点线缺陷(亮暗点,亮暗线),Mura缺陷(亮度显示不均),外观缺陷(划伤,破损,脏污)等。

SVD(奇异值分解)算法主要用于图像的降维和重构,图像重构一般是取前k个较大的奇异值,其他值置为0,滤除干扰噪声从而实现图像重构;而论文作者反其道而行,令前k个奇异值为0进行图像重构,用于凸显图片中的各类缺陷,达到缺陷检测的目的。

根据SVD的算法原理,较大奇异值包含图像主要特征,而较小奇异值包含噪声信息,在实验中发现,重构图片中,除了凸显出Mura缺陷外,还包含很多雪花状噪声;随着k值的增大,当k值超过一个阈值后,重构图片中Mura缺陷将会消失;故,我们可以将奇异值矩阵分为3部分:包含图像主要特征的较大奇异值,包含缺陷特征的相对较大奇异值,包含噪声特征的较小奇异值,将较大奇异值和较小奇异值都置零,只保留相对较大奇异值,以此重构图像,在图像缺陷信息基础上同时做去噪处理。

参考资料:
Lu, CJ., Tsai, DM. Automatic defect inspection for LCDs using singular value decomposition. AMT 25, 53–61 (2005). https://doi.org/10.1007/s00170-003-1832-6
反向应用SVD(奇异值分解)算法检测显示屏缺陷
反向应用SVD(奇异值分解)算法检测显示屏缺陷(续)


一、SVD算法简介

一整张图片就是一个像素值矩阵,每个像素值0-255之间,SVD可以把一个矩阵分解成左奇异向量矩阵U、奇异值矩阵 Σ(S)和右奇异向量矩阵VT
奇异值分解
正交矩阵U:m行m列,该矩阵的每一个列向量都是AAT的特征向量;
正交矩阵VT:n行n列,该矩阵的每一个列向量都是ATA的特征向量;
对角阵Σ:m行n列,将ATA或AAT的特征值开根号,得到的就是该矩阵主对角线上的元素,也可以看成矩阵A的奇异值。

二、代码实现

#include <iostream>
#include <opencv.hpp>
using namespace std;
using namespace cv;

#define R 0.3
#define G -0.03

/*
* @param cv::Mat S	 特征值集合
* @param int	 k	 上限
* @param int	 l	 下限
* @brief 根据经验公式计算k和l
*/
void get_k_l(const cv::Mat& S, int& k, int& l)
{
	cv::Mat S_ = S.clone();
	//求特征值的平均值和方差
	cv::Mat meanMat, stdMat;
	cv::meanStdDev(S, meanMat, stdMat);

	for (int i = 0; i < S.rows; i++)
	{
		S_.at<float>(i, 0) = (S_.at<float>(i, 0) - meanMat.at<double>(0)) / stdMat.at<double>(0);
	}

	//计算k
	for (int i = 0; i < S.rows; i++)
	{
		if (S_.at<float>(i, 0) < R)
		{
			k = i;
			break;
		}
	}

	//计算g
	for (int i = 0; i < S.rows; i++)
	{
		if (S_.at<float>(i, 0) < G)
		{
			l = i;
			break;
		}
	}
}

/*
* @param cv::Mat src 输入图像(单通道灰度图像)
* @param cv::Mat dst 输出图像
* @param int	 k	 上限
* @param int	 l	 下限
* @param bool 	 cal	true--自动计算,只需修改G\R;false--手动指定k和l
* @brief svd分解
*/
void svd(const cv::Mat& src, cv::Mat& dst,int k,int l,bool cal)
{
	cv::Mat src_ = src.clone();
	src_.convertTo(src_, CV_32FC1);
	cv::Mat U, S, Vt;
	cv::SVD::compute(src_, S, U, Vt);	//SVD分解
	// S是n行1列(CV_32F);U是m行n列(CV_32F);Vt是n行n列(CV_32F)

	//自动计算
	if(cal) get_k_l(S, k, l);
	if (k < 0)
	{
		cout << "k should larger than 0";
		return;
	}

	if (l <= k)
	{
		cout << "l should larger than k";
		return;
	}

	int min_dim = min(src.rows, src.cols);

	cv::Mat S_(min_dim, min_dim, CV_32FC1, cv::Scalar(0));
	for (int i = k; i <= l; i++)
	{
		S_.at<float>(i, i) = S.at<float>(i, 0);
	}

	cv::Mat result = U * S_ * Vt;
	result.convertTo(dst, CV_8UC1);
}

int main()
{
	string path = "F://work_study//algorithm_demo//";
	cv::Mat src = cv::imread(path + "lena.jpg", cv::IMREAD_GRAYSCALE);
	if (src.empty())
		return -1;


	cv::Mat dst;
	svd(src, dst, 10, 20,true);

	imshow("dst", dst);
	cv::waitKey(0);
	return 0;
}

lena
svd


总结

本文主要介绍了SVD分解在图像重构、缺陷检测的应用,使用C++基于OpenCV库实现。
对于奇异值,它跟我们特征分解中的特征值类似,在奇异值矩阵中也是按照从大到小排列,而且奇异值的减少特别的快,在很多情况下,前10%甚至1%的奇异值的和就占了全部的奇异值之和的99%以上的比例。我们也可以用最大的k个的奇异值和对应的左右奇异向量来近似描述矩阵。
该算法的特征值性质有点类似频率域的高频、低频、中频等,欢迎大家交流。
本文代码均在本地运行成功,有问题多交流。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

爬虫:爬取豆瓣电影

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 上篇我们将到如何利用xpath的规则&#xff0c;那么这一次&#xff0c;我们将通过案例来告诉读者如何使用Xpath来定位到我们需要的数据&#xff0c;就算你不懂H5代码是怎么个嵌套或者十分复…

cesium 雷达遮罩(电弧球效果)

cesium 雷达遮罩(电弧球效果) 以下为源码直接复制可用 1、实现思路 通过修改“material”材质来实现轨迹球效果 2、代码示例 2.1 index.html <!DOCTYPE html> <html lang="en"><head><!

Python | Leetcode Python题解之第70题爬楼梯

题目&#xff1a; 题解&#xff1a; class Solution:def climbStairs(self, n: int) -> int:a, b 1, 1for _ in range(n - 1):a, b b, a breturn b

C#winfrom三层架构实现简单课程管理系统管理系统,三层架构实现增删改查

1. 项目展示 1.1登录展示 1.2添加课程信息展示 1.3课程信息管理-查询-修改-删除 1.4修改登录密码 2.项目功能介绍&#xff08;图&#xff09; 3.数据库设计 3.1 教师表设计 3.2 课程分类表 3.3 课程信息表 4. 创建样式界面 winfrom 超详细UI创建过程 实现双色球选号器UI界面…

在国企分公司做信息宣传新闻投稿的经验分享

作为一名国企分公司的信息宣传工作者,我亲历了从传统投稿方式到数字化转型的全过程,这段经历既充满了挑战,也收获了成长。回首最初的日子,那些用邮箱投稿的时光,至今仍让我感慨万千。 初尝辛酸,邮箱投稿的艰难岁月 刚接手信息宣传工作时,我满腔热情,却很快被现实的冷水浇了个透…

Blender材质,纹理,UV

1.材质Material&#xff0c;用于描述物体的表面性质&#xff0c;包含以下基本属性 -基础色 -金属/非金属 -粗糙度 -透光度 -凹凸细节 添加材质步骤&#xff1a; 1&#xff09;切换到材质预览模式 2&#xff09;打开材质面板 3&#xff09;添加一个材质&#xff0c;包括材…

node.js对数据库mysql的连接与操作(增、删、改、查、五种SQL语法)

前提&#xff1a;先在vscode终端下载安装mysql&#xff1a;npm install mysql -save 步骤总结&#xff1a; (1)建立与数据库的连接 (2)做出请求&#xff1a; 实际上就是操作mysql里的数据。增删改查 insert、delete、updata、select (3)通过回调函数获取结果 一、什么是SQ…

spring高级篇(七)

1、异常处理 在DispatcherServlet中&#xff0c;doDispatch(HttpServletRequest request, HttpServletResponse response) 方法用于进行任务处理&#xff1a; 在捕获到异常后没有立刻进行处理&#xff0c;而是先用一个局部变量dispatchException进行记录&#xff0c;然后统一由…

ssm+vue的私人健身和教练预约管理系统(有报告)。Javaee项目,ssm vue前后端分离项目。

演示视频&#xff1a; ssmvue的私人健身和教练预约管理系统(有报告)。Javaee项目&#xff0c;ssm vue前后端分离项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通…

字体设计_西文字体设计(英文字体设计)

一 西文字体设计基础知识 设计目标和历史成因 设计目标&#xff1a;让眼睛看着舒服的字体 那什么样的字体让眼睛看着舒服呢&#xff1f; 让眼睛看着舒服的字体造型其实是我们记忆里的手写体、自然造型。 所以就能理解西文字体为什么同一笔画&#xff0c;有的地方粗有的地方…

flowable一对并发网关跳转的分析

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://218.75.87.38:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a; h…

数字孪生项目的开发

数字孪生项目开发涉及多学科知识和技术&#xff0c;因此存在以下技术难点&#xff0c;数字孪生项目开发是一项复杂的工程&#xff0c;需要攻克多项技术难关。随着技术的不断发展&#xff0c;数字孪生技术将得到更加广泛的应用&#xff0c;并在各行各业发挥更大的作用。北京木奇…

C语言 函数的嵌套与递归 调用

本文 我们来说函数的嵌套调用和递归调用 在很多大型项目中 我们肯定不可能将所有逻辑都写在一个函数中 肯定要按功能拆解成多个特定的功能函数 函数并不允许嵌套调用&#xff0c;但是 允许在逻辑代码中嵌套调用 所谓函数嵌套调用 就是在一个函数中调用另一个函数&#xff0c;而…

双向BFS算法学习

双向BFS算法学习 推荐练习题 力扣“127”题&#xff1a;单词接龙 “752”题&#xff1a;打开轮盘锁 这里推荐一篇力扣题解 双向BFS 这里使用打开轮盘锁的题干进行举例&#xff1a; 你有一个带有四个圆形拨轮的转盘锁。每个拨轮都有10个数字&#xff1a; ‘0’, ‘1’, ‘2’,…

Django项目中的Nginx+uWSGI

Django项目中的NginxuWSGI部署 配合另一篇博客共同饮用Django项目服务器部署&#xff08;2024最新&#xff09; 一&#xff1a;Nginx uWSGI部署框架 用户浏览器向nginx发送请求&#xff0c;nginx判断请求是动态海事静态&#xff0c;如果是静态请求&#xff0c;则直接返回静态…

Redis系列-1 Redis介绍

背景&#xff1a; 本文介绍Redis相关知识&#xff0c;包括Redis的使用、单线程机制、事务、内存过期和淘汰机制。后续将在《Redis系列-2 Redis持久化机制》中介绍Redis基于RDB和AOF的持久化机制&#xff1b;在《Redis系列-3 Redis缓存问题》中介绍缓存击穿、缓存穿透、缓存雪崩…

快速排序(java细节实现)

目录 快速排序: Hoare版: 挖坑法 快速排序的优化 快速排序的非递归实现 小结 从小到大排序 快速排序: 基本思想为&#xff1a;任取待排序元素序列中的某元素作为基准值&#xff0c;按照该排序码将待排序集合分割成两子序列&#xff0c;左子序列中所有元素均小于基准值&…

C++:AVL树

概念&#xff1a; 二叉搜索树虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序二叉搜索树将退化为单支树&#xff0c;查 找元素相当于在顺序表中搜索元素&#xff0c;效率低下。 如图所示&#xff0c;搜索二叉树不能面对右边的树&#xff0c;这种极端的情况&#xf…

[iOS]从拾遗到Runtime(上)

[iOS]从拾遗到Runtime(上) 文章目录 [iOS]从拾遗到Runtime(上)写在前面名词介绍instance 实例对象class 类对象meta-class 元类对象为什么要有元类&#xff1f; runtimeMethod(objc_method)SEL(objc_selector)IMP 类缓存(objc_cache)Category(objc_category) 消息传递消息传递的…

【how2j JQuery部分】课后题答案及相关笔记

练习题 <script src"jquery.min.js"></script><script>$(function(){$(tr:odd).css({"background-color":"#f8f8f8"});}); </script> <style> table{border-collapse:collapse;width:90%;} tr{border-bottom-sty…
最新文章