图像处理黑科技—破解文档识别难题(PS检测、弯曲拉平、切边切片、摩尔纹)
一、文檔識別難題
我們通過視覺、聽覺、觸覺、嗅覺來認知周圍環(huán)境客觀物體。眼睛是我們探測周圍物體光線的接收器,它探測了物體的明暗、顏色、形狀和空間關(guān)系,人類對世界的感知 80% 是通過眼睛獲取,相比聽覺和觸覺來說,視覺更有沖擊力。
利用眼睛理解外部事物的過程通常就是視覺感知,視覺感知是人工智能當(dāng)中特別重要的問題之一,在視覺感知中,文檔文字識別是非常重要的計算機視覺技術(shù),因為文字是我們感知這個世界最重要的手段,文字可以說是人類文明的標(biāo)志,是信息交流的途徑,學(xué)習(xí)知識的重要渠道,是記錄歷史、思想、文化的載體。
我們把 OCR 比做 AI 技術(shù)的一雙慧眼,幫助人工智能看清所有需要處理的文字內(nèi)容、符號信息,然而目前低質(zhì)文檔圖像的識別問題似乎已經(jīng)成為 AI 技術(shù)落地中的瓶頸,文檔圖像作為一種非結(jié)構(gòu)化數(shù)據(jù),其分析識別面臨一些技術(shù)難點:
低質(zhì)文檔圖像難以識別:圖文混合、區(qū)域形狀不規(guī)則、變形文檔質(zhì)量退化嚴(yán)重,如下圖產(chǎn)生了極大的摩爾紋,為圖像識別帶來極大困難;
場景文本的文字檢測及版面分析困難:自然場景圖像的背景復(fù)雜、光照和拍照視角變化、文本行方向和形狀變化、字體風(fēng)格和顏色變化等,,如下圖手機拍照時角度傾斜,視角奇葩,文本準(zhǔn)確定位提取非常困難;
無法檢測過濾 PS 技術(shù)篡改:身份證、護照、行駛證、駕駛證、港澳通信證等證照類別,及增值稅發(fā)票、普通發(fā)票、小票、合同等文檔篡改后無法檢測出是否真實,PS 智能檢測在反欺詐、合規(guī)風(fēng)控等領(lǐng)域意義重大。如下圖證件修改過字和有效期數(shù)字,這為識別帶來了新的困難;
二、技術(shù)分析
2.1、切邊切片增強
2.1.1、技術(shù)介紹
目前自帶的數(shù)碼相機已經(jīng)成為了手機等移動設(shè)備的標(biāo)準(zhǔn)配置,這些數(shù)字成像設(shè)備經(jīng)常被用來拍攝各種文本圖像,由于拍攝習(xí)慣,取景需求等的不同,用戶拍攝到的文本圖像,一般是包含有背景的,而用戶需要的圖像,通常是去掉了背景區(qū)域的圖像。在票據(jù)識別、PPT 拍攝、名片識別、文稿備份時就需要用到切邊切片技術(shù)。如下圖所示:切邊后圖像可以更好的展示并提升下游任務(wù)(OCR 識別,信息抽取等)的準(zhǔn)確率。
2.1.2、原理分析
對普通圖像的切邊切片的步驟如下:1.加載圖像;2.對圖像進行灰度化;3.邊緣檢測;4.輪廓發(fā)現(xiàn);5.找出符合目標(biāo)的最大外接矩形,并使用矩形的四個坐標(biāo)點繪制線;6 切除 ROI(感興趣區(qū)域);7.顯示 ROI 區(qū)域。
對旋轉(zhuǎn)圖像的切邊切片的步驟如下:1.加載原圖;2.對圖像進行灰度化;3.邊緣檢測;4.輪廓發(fā)現(xiàn);5.找出圖像旋轉(zhuǎn)角度(a.找出旋轉(zhuǎn)矩形的最大寬和最大高 b.找出這個目標(biāo)矩形的旋轉(zhuǎn)角度及旋轉(zhuǎn)矩形。c.把此矩形繪制出來);6.根據(jù)圖片中心點及旋轉(zhuǎn)角度,制作目標(biāo)旋轉(zhuǎn)矩陣;7.利用仿射變換 + 第 6 步的旋轉(zhuǎn)矩陣實現(xiàn)最終的旋轉(zhuǎn)(仿射變換在圖像還原、圖像局部變化處理方面有重要意義);8.顯示最終圖像。
仿射變換是指在向量空間中進行一次線性變換和一次平移變換到另一個向量空間的過程,仿射變換可以通過一系列的原子變換的復(fù)合來實現(xiàn),包括:平移、旋轉(zhuǎn)和翻折;縮放、錯切。沒有平移或者平移量為 0 的所有仿射變換都可以叫線性變換,線性變換可以用如下變換矩陣描述:
[x′y′]=[abcd][xy]\left[\begin{array}{l} x^{\prime} \\ y^{\prime} \end{array}\right]=\left[\begin{array}{ll} a & b \\ c & d \end{array}\right]\left[\begin{array}{l} x \\ y \end{array}\right][x′y′?]=[ac?bd?][xy?]
不同變換對應(yīng)的 a,b,c,d 約束不同,可以看上式,比如尺度變換的約束 a 就是 α,約束 d 就是 β,b 和 c 為 0,這樣 x‘=αx,y’=βy 就是將圖像沿著 x 軸放縮 α 倍,沿 y 軸放縮 β 倍。
而為了涵蓋平移變換,需要給矩陣加一個維度,如下:
[x′y′1]=[abcdef001][xy1]\left[\begin{array}{l} x^{\prime} \\ y^{\prime} \\ 1 \end{array}\right]=\left[\begin{array}{lll} a & b & c \\ d & e & f \\ 0 & 0 & 1 \end{array}\right]\left[\begin{array}{l} x \\ y \\ 1 \end{array}\right]???x′y′1????=???ad0?be0?cf1???????xy1????
對應(yīng)的約束有:a,b,c,d,e,f,即具有 6 個自由度,不同基礎(chǔ)變換的 a,b,c,d,e,f 約束不同。平移變換時,b=0,d=0,a=1,b=1,c=λ,f=θ,那么 x‘=x+λ,y‘=y+θ,就是將圖像沿 x 軸平移 λ 位,將圖像沿 y 軸平移 θ 位。
為了使圖像能夠旋轉(zhuǎn),我們加入了三角函數(shù),最終的矩陣變換我們定義為:
[scos?(θ)?ssin?(θ)txssin?(θ)scos?(θ)ty001][xy1]=[x′y′1]\left[\begin{array}{ccc} s \cos (\theta) & -s \sin (\theta) & t_{x} \\ s \sin (\theta) & s \cos (\theta) & t_{y} \\ 0 & 0 & 1 \end{array}\right]\left[\begin{array}{l} x \\ y \\ 1 \end{array}\right]=\left[\begin{array}{l} x^{\prime} \\ y^{\prime} \\ 1 \end{array}\right]???scos(θ)ssin(θ)0??ssin(θ)scos(θ)0?tx?ty?1???????xy1????=???x′y′1????
最終的仿射變換就是線性變換和平移變換如此疊加而來的,仿射變換能夠給予圖片放縮、旋轉(zhuǎn)、平移、偏移等幾何變換功能。
2.2、彎曲矯正拉平
2.2.1、技術(shù)介紹
不同于平面掃描儀獲得的文檔圖像,由手持鏡頭拍照得到的文檔圖像往往含有幾何形變以及環(huán)境背景的干擾。這會使得現(xiàn)有文檔信息抽取和內(nèi)容分析系統(tǒng)的性能下降。如紙張的內(nèi)容歪斜扭曲,部分紙張本身就不平整,存在過折疊、皺紋的畸變問題且本身厚度造成拍照過程中存在的圖像的彎曲畸變。如下圖所示形變矯正后圖像能夠更好的展示,并能顯著提升下游任務(wù)(OCR 識別,版面分析/還原等)的準(zhǔn)確率。
2.2.2、原理分析
DocUNet:具有中間監(jiān)督的堆疊圖像解扭曲網(wǎng)絡(luò)
DocUNet 依賴于卷積神經(jīng)網(wǎng)絡(luò)(CNN)進行端到端圖像恢復(fù)。模型由兩個 U-Net 組成。其中,U-Net 是一個完全卷積網(wǎng)絡(luò),它包含一系列下采樣層和一系列上采樣層。特征圖在下采樣層和上采樣層之間連接。然而,單個 U-Net 的輸出無法完成工作,受連續(xù)預(yù)測和漸進精化工作的啟發(fā),文章將另一個 U-Net 作為精化器疊加在第一個 U-Net 的輸出端。第一個 U-Net 在最后一個反褶積層之后分裂,而第一個 U-Net 和中間預(yù)測 y1 的反卷積特征被連接在一起作為第二個 U-Net 的輸入。第二個 U-Net 最終給出精確的預(yù)測。
DewarpNet:使用堆疊的 3D 和 2D 回歸網(wǎng)絡(luò)對單圖像文檔進行解扭曲
DewarpNet 由兩個子網(wǎng)絡(luò)組成:形狀網(wǎng)絡(luò)和紋理映射網(wǎng)絡(luò)。此外,文章還提出了一個用于光照效果調(diào)整的后處理增強細化網(wǎng)絡(luò),該模塊可以在視覺上改善未旋轉(zhuǎn)的圖像。
形狀網(wǎng)絡(luò):將此回歸任務(wù)表述為圖像到圖像的轉(zhuǎn)換問題。形狀網(wǎng)絡(luò)將 I 的每個像素轉(zhuǎn)換為 3D 坐標(biāo)圖,C∈ Rh×w×3,其中每個像素值(X,Y,Z)對應(yīng)于文檔形狀的 3D 坐標(biāo)。在設(shè)計形狀網(wǎng)絡(luò)時,文章使用跳連接的 U-Net 型編碼器-解碼器架構(gòu)。
紋理映射網(wǎng)絡(luò):以三維坐標(biāo)映射 C 為輸入,輸出后向映射 B。在紋理映射網(wǎng)絡(luò)中,采用了一種多 DenseNet 塊的編解碼結(jié)構(gòu)。
細化網(wǎng)絡(luò):作為后處理組件以調(diào)整校正圖像中的照明效果。該網(wǎng)絡(luò)不僅提高了結(jié)果的感知質(zhì)量,而且提高了 OCR 性能。文章利用 Doc3D 數(shù)據(jù)集中的額外地面真實信息(即表面法線和反照率地圖)來訓(xùn)練細化網(wǎng)絡(luò)。細化網(wǎng)絡(luò)有兩個 U-Net 型編碼器解碼器:一個用于預(yù)測曲面法線 N∈ ×3 給定輸入圖像 I;另一個以 I 和對應(yīng)的 N 作為輸入并估計陰影圖 S∈ Rh×w×3.S 描述陰影強度和顏色。
2.3、摩爾紋去除
2.3.1、技術(shù)介紹
當(dāng)感光元件像素的空間頻率與影像中條紋的空間頻率接近時,可能產(chǎn)生一種新的波浪形的干擾圖案,即所謂的摩爾紋,最形象來說,我們用手機拍攝電腦、電視上的畫面,或者拍攝條紋和格子的衣服時,拍出來的照片上總是有奇奇怪怪的彩色條紋,這些紋理由摩爾效應(yīng)引起的。摩爾效應(yīng)是一種特殊的光學(xué)現(xiàn)象,它是兩條線或兩個物體之間以固定的角度和頻率發(fā)生干涉后產(chǎn)生的視覺效果。如下圖所示:
而摩爾紋去除,可以幫助消除屏幕紋對畫質(zhì)的干擾,提高圖像、文字清晰度,如下圖運用摩爾紋去除網(wǎng)絡(luò)后,圖像質(zhì)量明顯提升:
2.3.2、原理分析
基于多分辨率卷積神經(jīng)網(wǎng)絡(luò)的摩爾紋圖像恢復(fù)
網(wǎng)絡(luò)架構(gòu)如上圖所示,其中包括不同分辨率的多個并行分支,圖像輸入為 2562563,使用非線性激活函數(shù) + 卷積核。可以看到:
(1)網(wǎng)絡(luò)中不采用池化層,通過步長為 2 的卷積核來代替池化操作。
(2)下采樣過程中大量使用 3*3 卷積核,步長為 1。
(3)在反卷積過程中,增大了圖像分辨率,生成 3 通道像素圖,最后通過疊加完成輸出。
頂部的分支以輸入圖像的原始分辨率處理特征映射,而其他分支處理越來越粗糙的特征映射。每個分支中的前兩個卷積層形成一個組,在所有分支的前兩個卷積層之后生成的特征圖可以堆疊在一起以形成倒置金字塔。金字塔使用非線性“濾波器”(即卷積核 + 非線性激活函數(shù))計算。然后通過將輸入圖像轉(zhuǎn)換為不同分辨率的多個特征圖,在輸入圖像中顯示不同級別的細節(jié)。更重要的是,在網(wǎng)絡(luò)中,每個分辨率都與一個網(wǎng)絡(luò)分支相關(guān)聯(lián),其中六個堆疊卷積層保持相同的分辨率。 這樣的網(wǎng)絡(luò)分支能夠執(zhí)行復(fù)雜的非線性變換(例如去除特定頻帶內(nèi)的摩爾紋),并且比 U-Net 中的跳過連接(Skip Connection)更強大。
在每個分支內(nèi),前兩層的輸出特征圖被饋送到級聯(lián)卷積層序列中。這些卷積層保持相同的輸入和輸出分辨率,并且不執(zhí)行任何下采樣或池操作。他們負責(zé)消除與該分支的特定頻帶相關(guān)的莫爾效應(yīng)的核心任務(wù),另外在這個序列中放置了多個卷積層(通常為 5 個),每個卷積層具有 3×3 個核和 64 個通道。
為了將所有并行分支的變換結(jié)果組合到一個完整的輸出圖像中,需要將級聯(lián)卷積層生成的特征圖的分辨率提高到除第一個分支外的每個分支內(nèi)輸入圖像的原始分辨率。在從頂部開始的第 i 個分支中,模型使用一組 i?1 個反卷積層來實現(xiàn)這一目標(biāo)。每個反卷積層使輸入分辨率加倍。在每個分支內(nèi)的反褶積層之后有一個額外的卷積層。這個額外的層生成一個只有 3 個通道的特征圖。該特征圖基本上消除了與該分支的頻帶相關(guān)聯(lián)的摩爾圖案(在輸入圖像中)的分量。最后,來自所有分支的最終 3 通道特征圖被簡單地相加在一起,以產(chǎn)生去除莫爾紋圖案的最終輸出圖像。
三、黑科技體驗
日前舉行的 2022 中國圖像圖形大會《ocr 前沿技術(shù)與產(chǎn)業(yè)應(yīng)用》論壇上,合合信息公司自然語言算法研發(fā)總監(jiān)丁凱博士介紹的該公司智能文字識別及圖像處理技術(shù),被參加論壇的中科院、北京大學(xué)、聯(lián)想研究院等頂尖科研機構(gòu)的專家,一致認為是破解難題的“鑰匙”。
經(jīng)過體驗,合合信息公司智能文字識別及圖像處理技術(shù),通過引入ai(人工智能)技術(shù),能夠幫助各應(yīng)用領(lǐng)域簡化下游文檔處理任務(wù),提升文字識別效率與準(zhǔn)確性。
筆者在研究圖像處理時也深入體驗了一次他們的黑科技。
3.1、功能介紹
官網(wǎng)提供了高精準(zhǔn)度的智能文字識別引擎及場景化產(chǎn)品,支持多種部署方式,可以幫助提升文檔處理流程的效率。包括證件識別、圖像切邊切片、PS 檢測、自動擦除手寫文章、去除摩爾紋、圖像矯正、水印去除、文檔轉(zhuǎn)換等等。
下面我們挑選最感興趣的文檔圖像切邊矯正和 PS 檢測進行體驗。
3.2、文檔圖像切邊矯正
文檔圖像切邊矯正功能可以智能定位圖像中文檔主體的邊緣,并進行背景切除 (文檔提取),對形變文檔進行矯正。
官網(wǎng)提供了 API 調(diào)用的接口和文檔:
請求 URL:https://api.textin.com/ai/service/v1/dewarp
HTTP 請求方法:HTTP POST
請求頭說明(Request Header)
URL 參數(shù)
請求體說明(Request Body)
Content-Type: application/octet-stream
要上傳的圖片,目前支持 jpg, png, bmp, pdf, tiff, 單幀 gif 等大部分格式.
響應(yīng)體說明(Response Data)
Content-Type: application/json。JSON 結(jié)構(gòu)說明如下:
JSON結(jié)構(gòu)示例
于是,我們可以使用 html 代碼調(diào)用接口:
<!doctype html> <html lang="zh-CN"> <head><meta charset="UTF-8"><title>服務(wù)集成演示</title> </head> <body><h2>上傳文件</h2> <div><input type="file" id="file"> </div><script>document.querySelector('#file').addEventListener('change', function(e) {var file = e.target.files[0] // 上傳文件的 File 對象var reader = new FileReader()reader.readAsArrayBuffer(file) // 讀取成二進制reader.onload = function (e) {var fileData = this.resultvar xhr = new XMLHttpRequest()// --------------------------------------------------------------------var appId = 'c81f*************************e9ff'// 請登錄后前往 “工作臺-賬號設(shè)置-開發(fā)者信息” 查看 x-ti-secret-code// 示例代碼中 x-ti-secret-code 非真實數(shù)據(jù)var secretCode = '5508***********************1c17'// 文檔圖像切邊矯正 服務(wù)URLvar url = 'https://api.textin.com/ai/service/v1/dewarp'xhr.open('POST', url)xhr.setRequestHeader('x-ti-app-id', appId)xhr.setRequestHeader('x-ti-secret-code', secretCode)xhr.onreadystatechange = function () {if (xhr.readyState === 4) {xhr.onreadystatechange = nullvar response = xhr.responsevar obj = {}try {obj = JSON.parse(response) // 轉(zhuǎn)化為對象} catch (e) {}if (!obj.result) returnvar list = obj.result.item_listif (!list || !list.length) returnconsole.log(list)}}xhr.send(fileData)}})</script> </body> </html>我們使用一副傾斜角度的圖像進行測試:
上傳圖片后,顯示成功調(diào)用 API,JSON 對象返回如下,message:success 表示成功,result image 表示的是修正后的圖像的 base64 表示。
我們使用
解碼 base64 格式的字符串,得到圖像,發(fā)現(xiàn)調(diào)用成功,圖像被成功矯正了
3.2、PS 檢測
另外一個很牛的就是 PS 檢測系統(tǒng),基于行業(yè)領(lǐng)先的自研篡改檢測系統(tǒng),可判斷圖片是否被篡改,支持身份證、護照、行駛證、駕駛證、港澳通信證等證照類別,及增值稅發(fā)票、普通發(fā)票、小票、合同等文檔類別。
網(wǎng)站提供了豐富的 API 調(diào)用接口和文檔
請求 URL:https://api.textin.com/ai/service/v1/manipulation_detection
HTTP 請求方法:HTTP POST
請求頭說明(Request Header)
URL 參數(shù)
請求體說明(Request Body)
Content-Type: application/octet-stream
要上傳的圖片,目前支持 jpg, png, bmp, pdf, tiff, webp, 單幀 gif 等大部分格式
響應(yīng)體說明(Response Data)
JSON 結(jié)構(gòu)說明如下:
JSON結(jié)構(gòu)示例
{"code": 200,"message": "success","version": "1.0.1","duration": 100,"result": {"image_width": 1024,"image_height": 1024,"image_property": {"ps": {"image": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBD","is_tampered": 1,"positions": [[38,88,42,8,42,12,38,12],[48,88,52,8,52,12,48,12]]}}} }這次我們使用 java 代碼調(diào)用接口:
import java.io.*; import java.net.HttpURLConnection; import java.net.URL; import java.io.IOException;public class Main {public static void main(String[] args) throws Exception {// PS檢測String url = "https://api.textin.com/ai/service/v1/manipulation_detection";// 請登錄后前往 “工作臺-賬號設(shè)置-開發(fā)者信息” 查看 x-ti-app-id// 示例代碼中 x-ti-app-id 非真實數(shù)據(jù)String appId = "c81f*************************e9ff";// 請登錄后前往 “工作臺-賬號設(shè)置-開發(fā)者信息” 查看 x-ti-secret-code// 示例代碼中 x-ti-secret-code 非真實數(shù)據(jù)String secretCode = "5508***********************1c17";BufferedReader in = null;DataOutputStream out = null;String result = "";try {byte[] imgData = readfile("example.jpg"); // imageURL realUrl = new URL(url);HttpURLConnection conn = (HttpURLConnection)realUrl.openConnection();conn.setRequestProperty("connection", "Keep-Alive");conn.setRequestProperty("Content-Type", "application/octet-stream");conn.setRequestProperty("x-ti-app-id", appId);conn.setRequestProperty("x-ti-secret-code", secretCode);conn.setDoOutput(true);conn.setDoInput(true);conn.setRequestMethod("POST"); // 設(shè)置請求方式out = new DataOutputStream(conn.getOutputStream());out.write(imgData);out.flush();out.close();in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));String line;while ((line = in.readLine()) != null) {result += line;}} catch (Exception e) {System.out.println("發(fā)送 POST 請求出現(xiàn)異常!" + e);e.printStackTrace();}finally {try {if (out != null) {out.close();}if (in != null) {in.close();}} catch (IOException ex) {ex.printStackTrace();}}System.out.println(result);}public static byte[] readfile(String path){String imgFile = path;InputStream in = null;byte[] data = null;try{in = new FileInputStream(imgFile);data = new byte[in.available()];in.read(data);in.close();}catch (IOException e) {e.printStackTrace();}return data;}}同樣,我們使用一張被 PS 篡改過后的圖像進行測試,調(diào)用接口運行后,返回 json 為:
我們打開 imageproperty,查找 ps 中的 is_tampered,代碼顯示為 1,即表明檢測到這幅圖像被 PS 修改過,返回 image 圖像為檢測到修改的地方的圖像。
四、總結(jié)
經(jīng)過技術(shù)分析,目前低質(zhì)文檔圖像的識別問題似乎已經(jīng)成為 AI 技術(shù)落地中的瓶頸,文檔圖像作為一種非結(jié)構(gòu)化數(shù)據(jù),其分析識別確實存在不少技術(shù)難點。
合合信息專注于智能文字識別、圖像處理、自然語言處理(NLP)、知識圖譜、大數(shù)據(jù)挖掘等技術(shù)。基于自主研發(fā)的領(lǐng)先的智能文字識別及商業(yè)大數(shù)據(jù)核心技術(shù),為全球 C 端用戶和多元行業(yè) B 端客戶提供數(shù)字化、智能化的產(chǎn)品及服務(wù)。
合合信息 C 端產(chǎn)品方面的落地非常成熟,掃描全能王(智能掃描及文字識別 APP)、名片全能王(智能名片及人脈管理 APP)、啟信寶(企業(yè)商業(yè)信息查詢 APP)這些耳熟能詳?shù)漠a(chǎn)品覆蓋了全球百余個國家和地區(qū)的億級用戶;
而 B 端業(yè)務(wù)如合合旗下智能文字識別服務(wù)平臺 TextIn,為面向企業(yè)客戶提供以智能文字識別、商業(yè)大數(shù)據(jù)為核心的服務(wù),形成了包括基礎(chǔ)技術(shù)服務(wù)、標(biāo)準(zhǔn)化服務(wù)和場景化解決方案的業(yè)務(wù)矩陣,滿足客戶降本增效、風(fēng)險管理、智能營銷等多元需求。
在體驗過程中,TextIn 智能文字識別引擎可以從圖像和 PDF 文檔中提取印刷、手寫、印章、公式、表格、圖片等富文本信息,支持 50+ 多語言識別,眾多文檔類型,包括商業(yè)文件、發(fā)票、賬單、收據(jù)、名片和海報。在財務(wù)共享系統(tǒng)中可以從混貼的發(fā)票中切分、分類、提取字段信息,支持發(fā)票中錯行、傾斜、重疊、遮擋、形變、光照不均等復(fù)雜場景;在證件識別系統(tǒng)中支持 13 類國家證件識別,覆蓋個人和企業(yè)所需的 200+ 種證件識別;在人機結(jié)合系統(tǒng)中實現(xiàn)精準(zhǔn) 100% 識別,遠超越人類的辨識度;此外引擎提供了豐富的方便的 API 調(diào)用方法和文檔,且在通用場景中平均 1s 處理完一張文本圖像,用起來非常便捷迅速。
總結(jié)
以上是生活随笔為你收集整理的图像处理黑科技—破解文档识别难题(PS检测、弯曲拉平、切边切片、摩尔纹)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java学习资料--网盘分享
- 下一篇: C语言 冒泡排序