AIStudio扫描王实现与原理详解

2024-01-01 23:30

本文主要是介绍AIStudio扫描王实现与原理详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

★★★ 本文源自AI Studio社区精品项目,【点击此处】查看更多精品内容 >>>


AIStudio扫描王实现与原理详解

一、前言

  大家经常有需要使用扫描件的时候,如果是要求不太高的场景,我们通常会使用手机拍照,再经过一些APP应用的处理,就生成了扫描件。但是,通常会有广告,并且一些功能是收费的,那么我们有没有其他的办法实现这些功能呢?下面本项目将展示如何实现。

二、代码与原理

  只需要将图像加载到相应的代码中,无需任何应用程序即可在几秒钟内获得输出。这个代码可以通过Numpy和OpenCV基本函数来实现。示例图片如图所示。

  首先,我们需要导入库函数;其次使用滤波函数将阴影部分去除;最后输出需要的图像文件。那么什么是图像滤波呢?下面简单介绍一下图片滤波。

  图像滤波,即在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作,其处理效果的好坏将直接影响到后续图像处理和分析的有效性和可靠性[1]。

  图像滤波按图像域可分为两种类型:

  邻域滤波(Spatial Domain Filter),其本质是数字窗口上的数学运算。一般用于图像平滑、图像锐化、特征提取(如纹理测量、边缘检测)等,邻域滤波使用邻域算子——利用给定像素周围像素值以决定此像素最终输出的一种算子。邻域滤波方式又分为线性滤波和非线性滤波,其中线性滤波包括均值滤波、方框滤波和高斯滤波等,非线性滤波包括中值滤波和双边滤波等。

  频域滤波(Frequency Domain Filter),其本质是对像素频率的修改。一般用于降噪、重采样、图像压缩等。按图像频率滤除效果主要分为两种类型:低通滤波(滤除原图像的高频成分,即模糊图像边缘与细节)和高通滤波(滤除原图像的低频成分,即图像锐化)。

[1]图像滤波参考链接:https://blog.csdn.net/crossoverpptx/article/details/127307179

%matplotlib inlineimport cv2
import numpy as np
import matplotlib.pyplot as plt
2.1 最大滤波

  最大最小值滤波是一种比较保守的图像处理手段,与中值滤波类似,首先要排序周围像素和中心像
素值,然后将中心像素值与最小和最大像素值比较,如果比最小值小,则替换中心像素为最小值,
如果中心像素比最大值大,则替换中心像素为最大值。

  让我们假设我们有一定大小的图像I。我们编写的算法应该逐个遍历I的像素,并且对于每个像素(x,y),它必须找到该像素周围的邻域(大小为N x N的窗口)中的最大灰度值,并进行写入A中相应像素位置(x,y)的最大灰度值。所得图像A称为输入图像I的最大滤波图像。现在让我们通过代码来实现这个概念。

  1. max_filtering()函数接受输入图像和窗口大小N。
  2. 它最初在输入数组周围创建一个“墙”(带有-1的填充),当我们遍历边缘像素时会有所帮助。
  3. 然后,我们创建一个“ temp”变量,将计算出的最大值复制到其中。
  4. 然后,我们遍历该数组并围绕大小为N x N的当前像素创建一个窗口。
  5. 然后,我们使用“ amax()”函数在该窗口中计算最大值,并将该值写入temp数组。
  6. 我们将该临时数组复制到主数组A中,并将其作为输出返回。
  7. A是输入I的最大滤波图像。
def max_filtering(N, I_temp):wall = np.full((I_temp.shape[0]+(N//2)*2, I_temp.shape[1]+(N//2)*2), -1)wall[(N//2):wall.shape[0]-(N//2), (N//2):wall.shape[1]-(N//2)] = I_temp.copy()temp = np.full((I_temp.shape[0]+(N//2)*2, I_temp.shape[1]+(N//2)*2), -1)for y in range(0,wall.shape[0]):for x in range(0,wall.shape[1]):if wall[y,x]!=-1:window = wall[y-(N//2):y+(N//2)+1,x-(N//2):x+(N//2)+1]num = np.amax(window)temp[y,x] = numA = temp[(N//2):wall.shape[0]-(N//2), (N//2):wall.shape[1]-(N//2)].copy()return A
2.2 最小滤波

  最小滤波:此算法与最大滤波完全相同,但是我们没有找到附近的最大灰度值,而是在该像素周围的N x N邻域中找到了最小值,并将该最小灰度值写入B中的(x,y)。所得图像B称为图像I的经过最小滤波的图像,代码如下。

def min_filtering(N, A):wall_min = np.full((A.shape[0]+(N//2)*2, A.shape[1]+(N//2)*2), 300)wall_min[(N//2):wall_min.shape[0]-(N//2), (N//2):wall_min.shape[1]-(N//2)] = A.copy()temp_min = np.full((A.shape[0]+(N//2)*2, A.shape[1]+(N//2)*2), 300)for y in range(0,wall_min.shape[0]):for x in range(0,wall_min.shape[1]):if wall_min[y,x]!=300:window_min = wall_min[y-(N//2):y+(N//2)+1,x-(N//2):x+(N//2)+1]num_min = np.amin(window_min)temp_min[y,x] = num_minB = temp_min[(N//2):wall_min.shape[0]-(N//2), (N//2):wall_min.shape[1]-(N//2)].copy()return B

变量N(用于过滤的窗口大小)将根据图像中粒子或内容的大小进行更改。对于测试图像,选择大小N = 20。增强后的最终输出图像如下所示:

def background_subtraction(I, B):O = I - Bnorm_img = cv2.normalize(O, None, 0,255, norm_type=cv2.NORM_MINMAX)return norm_img

完整代码如下所示

%matplotlib inlineimport cv2
import numpy as np
import matplotlib.pyplot as pltdef max_filtering(N, I_temp):wall = np.full((I_temp.shape[0]+(N//2)*2, I_temp.shape[1]+(N//2)*2), -1)wall[(N//2):wall.shape[0]-(N//2), (N//2):wall.shape[1]-(N//2)] = I_temp.copy()temp = np.full((I_temp.shape[0]+(N//2)*2, I_temp.shape[1]+(N//2)*2), -1)for y in range(0,wall.shape[0]):for x in range(0,wall.shape[1]):if wall[y,x]!=-1:window = wall[y-(N//2):y+(N//2)+1,x-(N//2):x+(N//2)+1]num = np.amax(window)temp[y,x] = numA = temp[(N//2):wall.shape[0]-(N//2), (N//2):wall.shape[1]-(N//2)].copy()return Adef min_filtering(N, A):wall_min = np.full((A.shape[0]+(N//2)*2, A.shape[1]+(N//2)*2), 300)wall_min[(N//2):wall_min.shape[0]-(N//2), (N//2):wall_min.shape[1]-(N//2)] = A.copy()temp_min = np.full((A.shape[0]+(N//2)*2, A.shape[1]+(N//2)*2), 300)for y in range(0,wall_min.shape[0]):for x in range(0,wall_min.shape[1]):if wall_min[y,x]!=300:window_min = wall_min[y-(N//2):y+(N//2)+1,x-(N//2):x+(N//2)+1]num_min = np.amin(window_min)temp_min[y,x] = num_minB = temp_min[(N//2):wall_min.shape[0]-(N//2), (N//2):wall_min.shape[1]-(N//2)].copy()return Bdef background_subtraction(I, B):O = I - Bnorm_img = cv2.normalize(O, None, 0,255, norm_type=cv2.NORM_MINMAX)return norm_imgdef min_max_filtering(M, N, I):if M == 0:#max_filteringA = max_filtering(N, I)#min_filteringB = min_filtering(N, A)#subtractionnormalised_img = background_subtraction(I, B)elif M == 1:#min_filteringA = min_filtering(N, I)#max_filteringB = max_filtering(N, A)#subtractionnormalised_img = background_subtraction(I, B)return normalised_img
P = cv2.imread('Test_image.jpeg',0)
plt.imshow(P,cmap='gray')
plt.title("original image")
plt.show()

在这里插入图片描述

#We can edit the N and M values here for P and C images
O_P = min_max_filtering(M = 0, N = 20, I = P)#Display final output
plt.imshow(O_P, cmap = 'gray')
plt.title("Final output")
plt.show()

在这里插入图片描述

总结

  进行图片转换时,有两件事要注意。由于图像是灰度图像,如果图像背景较浅且对象较暗,则必须先执行最大滤波,然后再执行最小滤波。如果图像背景较暗且物体较亮,我们可以先执行最小滤波,然后再进行最大滤波。如果图像的背景较浅,我们要先执行最大过滤,这将为我们提供增强的背景,并将该最大过滤后的图像传递给最小过滤功能。

这篇关于AIStudio扫描王实现与原理详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/560793

相关文章

Springboot处理跨域的实现方式(附Demo)

《Springboot处理跨域的实现方式(附Demo)》:本文主要介绍Springboot处理跨域的实现方式(附Demo),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录Springboot处理跨域的方式1. 基本知识2. @CrossOrigin3. 全局跨域设置4.

Spring Boot 3.4.3 基于 Spring WebFlux 实现 SSE 功能(代码示例)

《SpringBoot3.4.3基于SpringWebFlux实现SSE功能(代码示例)》SpringBoot3.4.3结合SpringWebFlux实现SSE功能,为实时数据推送提供... 目录1. SSE 简介1.1 什么是 SSE?1.2 SSE 的优点1.3 适用场景2. Spring WebFlu

基于SpringBoot实现文件秒传功能

《基于SpringBoot实现文件秒传功能》在开发Web应用时,文件上传是一个常见需求,然而,当用户需要上传大文件或相同文件多次时,会造成带宽浪费和服务器存储冗余,此时可以使用文件秒传技术通过识别重复... 目录前言文件秒传原理代码实现1. 创建项目基础结构2. 创建上传存储代码3. 创建Result类4.

SpringBoot日志配置SLF4J和Logback的方法实现

《SpringBoot日志配置SLF4J和Logback的方法实现》日志记录是不可或缺的一部分,本文主要介绍了SpringBoot日志配置SLF4J和Logback的方法实现,文中通过示例代码介绍的非... 目录一、前言二、案例一:初识日志三、案例二:使用Lombok输出日志四、案例三:配置Logback一

springboot security快速使用示例详解

《springbootsecurity快速使用示例详解》:本文主要介绍springbootsecurity快速使用示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录创www.chinasem.cn建spring boot项目生成脚手架配置依赖接口示例代码项目结构启用s

Python如何使用__slots__实现节省内存和性能优化

《Python如何使用__slots__实现节省内存和性能优化》你有想过,一个小小的__slots__能让你的Python类内存消耗直接减半吗,没错,今天咱们要聊的就是这个让人眼前一亮的技巧,感兴趣的... 目录背景:内存吃得满满的类__slots__:你的内存管理小助手举个大概的例子:看看效果如何?1.

Python+PyQt5实现多屏幕协同播放功能

《Python+PyQt5实现多屏幕协同播放功能》在现代会议展示、数字广告、展览展示等场景中,多屏幕协同播放已成为刚需,下面我们就来看看如何利用Python和PyQt5开发一套功能强大的跨屏播控系统吧... 目录一、项目概述:突破传统播放限制二、核心技术解析2.1 多屏管理机制2.2 播放引擎设计2.3 专

Python中随机休眠技术原理与应用详解

《Python中随机休眠技术原理与应用详解》在编程中,让程序暂停执行特定时间是常见需求,当需要引入不确定性时,随机休眠就成为关键技巧,下面我们就来看看Python中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2

一文详解SpringBoot响应压缩功能的配置与优化

《一文详解SpringBoot响应压缩功能的配置与优化》SpringBoot的响应压缩功能基于智能协商机制,需同时满足很多条件,本文主要为大家详细介绍了SpringBoot响应压缩功能的配置与优化,需... 目录一、核心工作机制1.1 自动协商触发条件1.2 压缩处理流程二、配置方案详解2.1 基础YAML

Python实现无痛修改第三方库源码的方法详解

《Python实现无痛修改第三方库源码的方法详解》很多时候,我们下载的第三方库是不会有需求不满足的情况,但也有极少的情况,第三方库没有兼顾到需求,本文将介绍几个修改源码的操作,大家可以根据需求进行选择... 目录需求不符合模拟示例 1. 修改源文件2. 继承修改3. 猴子补丁4. 追踪局部变量需求不符合很