環(huán)境

創(chuàng)新互聯(lián)公司一直秉承“誠(chéng)信做人,踏實(shí)做事”的原則,不欺瞞客戶,是我們最起碼的底線! 以服務(wù)為基礎(chǔ),以質(zhì)量求生存,以技術(shù)求發(fā)展,成交一個(gè)客戶多一個(gè)朋友!為您提供網(wǎng)站制作、成都網(wǎng)站制作、成都網(wǎng)頁(yè)設(shè)計(jì)、成都微信小程序、成都網(wǎng)站開(kāi)發(fā)、成都網(wǎng)站制作、成都軟件開(kāi)發(fā)、重慶APP軟件開(kāi)發(fā)是成都本地專業(yè)的網(wǎng)站建設(shè)和網(wǎng)站設(shè)計(jì)公司,等你一起來(lái)見(jiàn)證!
矩形操作是我們?cè)?OpenCV 里最常用的操作,其中最為常見(jiàn)的就是包圍框( Bounding Box )和旋轉(zhuǎn)矩形( Rotated Box )。 其中包圍框是最為常見(jiàn)的,對(duì)應(yīng) OpenCV 中的 boundingRect() ,使用正矩形框處物體,一般多用在目標(biāo)檢測(cè)中。使用包圍框框柱目標(biāo)物體,這種操作比較簡(jiǎn)單,但是通常框中也會(huì)有一些其他的區(qū)域。其次就是使用旋轉(zhuǎn)矩形,也叫最小外接矩形,對(duì)應(yīng) OpenCV 中的 minAreaRect() ,用來(lái)使用旋轉(zhuǎn)矩形最大限度的框出目標(biāo)物體,減小背景干擾,在 OCR 任務(wù)中較為常用。
minAreaRect() 返回了所需區(qū)域的最小斜矩形的參數(shù),與包圍框直接返回四個(gè)頂點(diǎn)的坐標(biāo)不同,最小外接矩形返回的是矩形的 ((x, y), (w, h), angle) ,對(duì)應(yīng)了矩形的中心,寬度,高度和旋轉(zhuǎn)角度。
旋轉(zhuǎn)角度 angle 是水平軸( x 軸)逆時(shí)針旋轉(zhuǎn),與碰到的矩形的第一條邊的夾角。并且這個(gè)邊的邊長(zhǎng)是 width ,另一條邊邊長(zhǎng)是 height 。也就是說(shuō),在這里 width 與 height 不是按照長(zhǎng)短來(lái)定義的。
在 OpenCV 中,坐標(biāo)系原點(diǎn)在左上角,相對(duì)于 x 軸,逆時(shí)針旋轉(zhuǎn)角度為負(fù),順時(shí)針旋轉(zhuǎn)角度為正,所以函數(shù) minAreaRect() 返回的角度范圍時(shí) [-90~0) 。想象一個(gè)平放的長(zhǎng)矩形,調(diào)用 minAreaRect() 返回的角度為 -90 度。如果我們旋轉(zhuǎn)圖像,直到矩形樹(shù)立起來(lái),這是調(diào)用 minAreaRect() 得到的角度依然是 -90 度。
第一種裁剪旋轉(zhuǎn)矩形的方法是通過(guò)仿射變換旋轉(zhuǎn)圖像的方式。
仿射變換( Affine Transformation ) 是一種二維坐標(biāo)到二維坐標(biāo)之間的線性變換,保持二維圖形的“平直性”( straightness ,即變換后直線還是直線不會(huì)打彎,圓弧還是圓弧)和“平行性”( parallelness ,其實(shí)是指保二維圖形間的相對(duì)位置關(guān)系不變,平行線還是平行線,相交直線的交角不變。)。
計(jì)算過(guò)程:
如果不做邊長(zhǎng)和角度的判斷,則只會(huì)沿著 x 軸的順時(shí)針?lè)较蜃鱿嗤笮〗嵌鹊男D(zhuǎn),不能保證旋轉(zhuǎn)后的視角是正確的視角:
根據(jù)任務(wù)目標(biāo)的類型,做邊長(zhǎng)和角度的判斷并進(jìn)行相應(yīng)的調(diào)整,可以保證旋轉(zhuǎn)后的視角是正確的視角:
第二種裁剪旋轉(zhuǎn)矩形的方法是通過(guò)透視變換直接將旋轉(zhuǎn)矩形的四個(gè)頂點(diǎn)映射到正矩形的四個(gè)頂點(diǎn)。
透視變換( Perspective Transformation )是將圖片投影到一個(gè)新的視平面( Viewing Plane ),也稱作投影映射( Projective Mapping )。
計(jì)算過(guò)程:
以上兩種方法都可以用來(lái)?yè)溉⌒D(zhuǎn)矩形的內(nèi)容。仿射變換方法需要預(yù)先對(duì)整張圖進(jìn)行旋轉(zhuǎn),通過(guò)觀察旋轉(zhuǎn)后的圖像可以發(fā)現(xiàn),有一部分圖像被旋轉(zhuǎn)出了圖像邊界,如果你要摳取的目標(biāo)正好在圖像邊緣附近,那么很容易出界導(dǎo)致圖像摳取的缺失。同時(shí)我們需要對(duì)寬、高和角度做出動(dòng)態(tài)的調(diào)整;透視變換的方法直接對(duì)摳取區(qū)域進(jìn)行了映射,這種方法可以省略旋轉(zhuǎn)的步驟,并且不會(huì)出現(xiàn)摳取內(nèi)容的缺失。同時(shí)我們只需要對(duì)4個(gè)頂點(diǎn)之間的映射關(guān)系做好定義即可,不需要考慮角度的問(wèn)題。相對(duì)的,透視變換相對(duì)于仿射變換計(jì)算量更大一些,不過(guò)這在 c++ 的底層實(shí)現(xiàn)上帶來(lái)的時(shí)延差距小于 ms 。
? 日常工作中經(jīng)常要用Photoshop打印一些地質(zhì)圖,雖然說(shuō)PS有動(dòng)作錄制的功能,但是打印這個(gè)功能我嘗試過(guò)錄制動(dòng)作后并未能成功運(yùn)行,而且要打印的圖像尺寸很多都是不同的,試了幾次后就放棄了,直到后來(lái)Python學(xué)起來(lái)了,通過(guò)pywinauto庫(kù)實(shí)現(xiàn)了這個(gè)功能,在這里就簡(jiǎn)單記錄下吧。
? ? 在寫(xiě)Photoshop的打印操作之前,先來(lái)回顧下打印之前的圖像處理工作。
? ? 接到的地質(zhì)圖多為MapGIS程序?qū)С龅膉pg圖片,偶爾也會(huì)有Tif格式的遙感圖。對(duì)這些圖像進(jìn)行打印很簡(jiǎn)單,基本流程是:用PS打開(kāi)圖像-裁剪圖像四周空白邊緣-為圖像四周加上3cm寬白色邊框(為了美觀和裝訂的需要)-打印。那為啥用PS來(lái)打印不直接用Windows自帶打印呢,應(yīng)該是打印需要用到PS特定的顏色處理模式吧,經(jīng)過(guò)試驗(yàn),通過(guò)兩種方式打出來(lái)的色彩效果確實(shí)是不同的。
? 打印前圖像處理的主要目標(biāo)很簡(jiǎn)單:
? ? ? ? ? ? 1、裁剪圖像四周空白
? ? ? ? ? ? 2、為圖像四周加上3cm白色邊框? ?
下面就用Python實(shí)現(xiàn)它們
圖像處理主要用的是PIL這個(gè)庫(kù),中途由于單位電腦比較舊(4g內(nèi)存Win7 32位系統(tǒng),后來(lái)重裝成64位了,體驗(yàn)就是搞這種東西必須整個(gè)64位系統(tǒng)),性能不太行了,也用Opencv整了下,還是感覺(jué)PIL稍微快那么一點(diǎn)點(diǎn),不知道是不是錯(cuò)覺(jué)呢。
(后來(lái)發(fā)現(xiàn)這兩步在PS錄個(gè)動(dòng)作也能輕松完成(???))
一、獲取所有圖片路徑
? ? 有時(shí)候要打印的圖片會(huì)放在好多個(gè)不同文件夾里面,要把它們遍歷出來(lái):
import os
二、讀取圖片并裁剪四周空白
import PIL
獲得了圖像尺寸后接下來(lái)就要對(duì)圖像進(jìn)行邊緣空白的裁剪了(其實(shí)這兩步不分先后順序的):
裁剪的思路是網(wǎng)上搜到的,整理下就是:
1、先把圖像轉(zhuǎn)成灰度模式(值變成單一的0-255以方便判斷,如果要裁剪其他顏色我就不知道了,我這里只要裁掉最常見(jiàn)的由MapGIS導(dǎo)出的標(biāo)準(zhǔn)的白色邊緣)。
2、分別從四個(gè)方向掃描圖像,找到四個(gè)方向各自第一個(gè)灰度值不為255(最純粹的白色(???))的像素,記下它的坐標(biāo)(i,j)。
3、通過(guò)四組坐標(biāo)大小比較,得到圖像除了四周空白區(qū)域外的坐標(biāo)極值,也就得到了裁剪的區(qū)域左上(left,top)和右下坐標(biāo)(right,bottom)。
4、利用PIL.Image.crop(),完成圖像的裁剪。
5、沒(méi)了,就是后來(lái)發(fā)現(xiàn)PIL自帶這個(gè)算法,引用一下: 使用PIL裁剪圖片白邊
? ? 要是用PS來(lái)做呢,‘圖像-裁切-確定’就完事了。
三、給裁剪后的圖像加上x(chóng)厘米的白色邊框
這一步主要是為了打印出來(lái)的圖規(guī)范且美觀。
這一步要是用PS來(lái)搞,‘圖像-畫(huà)布大小-設(shè)置相對(duì)的寬度和高度’ 就好了
四、判斷圖像是否需要旋轉(zhuǎn)。
為什么要旋轉(zhuǎn)這些圖像呢?因?yàn)樽罱K是要把它們用打印機(jī)打印出來(lái),而打印機(jī)能打印的最大寬度是有限的,所以就有了這個(gè)步驟。
單位的打印機(jī)型號(hào)是惠普的HP DesignJet Z6200 60 英寸照片打印機(jī),最大打印紙張寬度是60英寸,大約就是1524mm左右吧,除了最大尺寸外,日常還用到的紙張寬度有440、610、914、1067、1274等6、7種吧,所以出于節(jié)約打印時(shí)間和省錢(qián)的考慮,為每張圖選擇最合適的打印紙張寬度也是很有必要的。
判斷圖像是否需要旋轉(zhuǎn)的思路是這樣的:
1、比較圖像的寬和高,判斷誰(shuí)是圖像的長(zhǎng)邊和短邊。
2、短邊如果大于1524mm,這圖按1:1就打不出來(lái)了,超過(guò)打印機(jī)最大可裝入的紙張的寬度,把這個(gè)圖像文件放到Oversize_path路徑下,后續(xù)自己看著辦。
3、在短邊小于等于1524mm的前提下,根據(jù)對(duì)圖像寬高和長(zhǎng)短邊的比較,有兩種需要旋轉(zhuǎn)的情況:
? ? ? ? 3.1 如果圖像的寬是長(zhǎng)邊(矮胖的矩形),且寬大于1524mm,那么這圖得旋轉(zhuǎn)90°;
? ? ? ? 3.2 如果圖像的高是長(zhǎng)邊(瘦高的矩形),且高小于1524mm,那么這圖也得旋轉(zhuǎn)90°。
*printTOtkinter()是個(gè)用tkinter搞的進(jìn)度顯示窗口,就輸出下一些文本信息而已。
五、為圖像選擇最合適的打印紙張尺寸
單位打印紙有438、610、914、1524等7種寬度,現(xiàn)在要選出最適合的一種來(lái)進(jìn)行打印。
在把短邊大于1524這種情況排除之后,剩下的圖像情況為短邊小于1524,即單位的打印機(jī)能打印出來(lái)了。
這時(shí)要判斷最佳打印用紙的寬度,有兩種情況需要考慮:
1、長(zhǎng)邊>1524,改用短邊來(lái)比較選擇打印紙寬度。
2、長(zhǎng)邊 ≤ 1524,用長(zhǎng)邊來(lái)比較選擇打印紙寬度。
下面思路就是把要用作比較的邊長(zhǎng)放入紙張寬度列表,把列表排序后找到比這個(gè)邊長(zhǎng)大一點(diǎn)的那個(gè)紙張寬度。
主要的步驟就是這些,再經(jīng)過(guò)一頓復(fù)制粘貼完善一下其他細(xì)節(jié)之后,最后會(huì)得到一個(gè)存放打印信息的列表,把它用txt存起來(lái),這樣后面的PS批量打印需要的信息就全部搞到手了。最后放個(gè)gif。
本節(jié)我們講介紹一下操作canvas時(shí)經(jīng)常用的工具API。在后續(xù)教程中我將會(huì)對(duì)每個(gè)工具進(jìn)行詳細(xì)介紹,本文把他們都介紹給大家,方便朋友們開(kāi)發(fā)之用。
用line和lines方法可以直接在canvas里繪制直線段
用shape方法可以繪制復(fù)雜的形狀
我們可以通過(guò)beginText函數(shù)創(chuàng)建text對(duì)象,然后可以通過(guò)textobject對(duì)文本進(jìn)行格式化處理。最后通過(guò)drawText完成最終的繪制工作。
Path對(duì)象與Text對(duì)象十分相似,他們可以繪制更為復(fù)雜的圖形(文字我們也歸類的圖形里)。
我們還可以使用clipPath來(lái)將一個(gè)矩形的照片剪裁成圓形的頭像。
ReportLab需要使用 Python Imaging Library(PIL)來(lái)處理圖片。
在ReportLab里定力兩種繪制圖形的方法,我們建議您采用drawImage方法,因?yàn)樵摲椒〒碛芯彺鏅C(jī)制,可以提供繪制效率。另外的方法是drawInlineImage,這個(gè)方法古老,該方法通過(guò)page stream方式存在位圖,如果您反復(fù)使用一張圖片,該方法每次都要重新繪制,從而造成性能低下的問(wèn)題。不過(guò)如果您的照片很少而且較少使用,那么drawInlineImage方法也是非常快速的。
我們先看看古老的方法
drawInlineImage可以在canvas上繪制圖片。image參數(shù)既可以是PIL對(duì)象也可以是圖片的地址。ReportLab接受大部分常用圖片文件格式,例如GIF或JPEG。這個(gè)函數(shù)最終返回一個(gè) tuple(組),其中包含圖片width和height
drawImage的參數(shù)和返回值與drawInlineImage基本一樣。然后,drawImage卻自帶了緩存系統(tǒng)。當(dāng)您第一次使用圖片時(shí),系統(tǒng)會(huì)將image引用存入序列中。如果您第二次使用時(shí),系統(tǒng)會(huì)根據(jù)文件名取隊(duì)列中查找,如果您用PIL對(duì)象,系統(tǒng)還會(huì)檢測(cè)PIL的內(nèi)容是否變更。
mask參數(shù)可幫助您創(chuàng)建一個(gè)透明的圖形。他有個(gè)6個(gè)參數(shù)可以擁有絕對(duì)RGB那個(gè)顏色被掩蓋或透明。
例如
他將使用1或0 來(lái)遮蓋紅色,40或41來(lái)覆蓋綠色。
showPage()方法將把所有內(nèi)容繪制到頁(yè)面中。
網(wǎng)頁(yè)題目:剪裁函數(shù)python python裁剪不規(guī)則區(qū)域
本文鏈接:http://chinadenli.net/article40/dojgpeo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、企業(yè)建站、外貿(mào)建站、服務(wù)器托管、搜索引擎優(yōu)化、響應(yīng)式網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)