真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

剪裁函數(shù)python python裁剪不規(guī)則區(qū)域

OpenCV Python實現(xiàn)旋轉(zhuǎn)矩形的裁剪

環(huán)境

創(chuàng)新互聯(lián)公司一直秉承“誠信做人,踏實做事”的原則,不欺瞞客戶,是我們最起碼的底線! 以服務(wù)為基礎(chǔ),以質(zhì)量求生存,以技術(shù)求發(fā)展,成交一個客戶多一個朋友!為您提供網(wǎng)站制作、成都網(wǎng)站制作、成都網(wǎng)頁設(shè)計、成都微信小程序、成都網(wǎng)站開發(fā)、成都網(wǎng)站制作、成都軟件開發(fā)、重慶APP軟件開發(fā)是成都本地專業(yè)的網(wǎng)站建設(shè)和網(wǎng)站設(shè)計公司,等你一起來見證!

矩形操作是我們在 OpenCV 里最常用的操作,其中最為常見的就是包圍框( Bounding Box )和旋轉(zhuǎn)矩形( Rotated Box )。 其中包圍框是最為常見的,對應(yīng) OpenCV 中的 boundingRect() ,使用正矩形框處物體,一般多用在目標檢測中。使用包圍框框柱目標物體,這種操作比較簡單,但是通??蛑幸矔幸恍┢渌膮^(qū)域。其次就是使用旋轉(zhuǎn)矩形,也叫最小外接矩形,對應(yīng) OpenCV 中的 minAreaRect() ,用來使用旋轉(zhuǎn)矩形最大限度的框出目標物體,減小背景干擾,在 OCR 任務(wù)中較為常用。

minAreaRect() 返回了所需區(qū)域的最小斜矩形的參數(shù),與包圍框直接返回四個頂點的坐標不同,最小外接矩形返回的是矩形的 ((x, y), (w, h), angle) ,對應(yīng)了矩形的中心,寬度,高度和旋轉(zhuǎn)角度。

旋轉(zhuǎn)角度 angle 是水平軸( x 軸)逆時針旋轉(zhuǎn),與碰到的矩形的第一條邊的夾角。并且這個邊的邊長是 width ,另一條邊邊長是 height 。也就是說,在這里 width 與 height 不是按照長短來定義的。

在 OpenCV 中,坐標系原點在左上角,相對于 x 軸,逆時針旋轉(zhuǎn)角度為負,順時針旋轉(zhuǎn)角度為正,所以函數(shù) minAreaRect() 返回的角度范圍時 [-90~0) 。想象一個平放的長矩形,調(diào)用 minAreaRect() 返回的角度為 -90 度。如果我們旋轉(zhuǎn)圖像,直到矩形樹立起來,這是調(diào)用 minAreaRect() 得到的角度依然是 -90 度。

第一種裁剪旋轉(zhuǎn)矩形的方法是通過仿射變換旋轉(zhuǎn)圖像的方式。

仿射變換( Affine Transformation ) 是一種二維坐標到二維坐標之間的線性變換,保持二維圖形的“平直性”( straightness ,即變換后直線還是直線不會打彎,圓弧還是圓?。┖汀捌叫行浴保?parallelness ,其實是指保二維圖形間的相對位置關(guān)系不變,平行線還是平行線,相交直線的交角不變。)。

計算過程:

如果不做邊長和角度的判斷,則只會沿著 x 軸的順時針方向做相同大小角度的旋轉(zhuǎn),不能保證旋轉(zhuǎn)后的視角是正確的視角:

根據(jù)任務(wù)目標的類型,做邊長和角度的判斷并進行相應(yīng)的調(diào)整,可以保證旋轉(zhuǎn)后的視角是正確的視角:

第二種裁剪旋轉(zhuǎn)矩形的方法是通過透視變換直接將旋轉(zhuǎn)矩形的四個頂點映射到正矩形的四個頂點。

透視變換( Perspective Transformation )是將圖片投影到一個新的視平面( Viewing Plane ),也稱作投影映射( Projective Mapping )。

計算過程:

以上兩種方法都可以用來摳取旋轉(zhuǎn)矩形的內(nèi)容。仿射變換方法需要預(yù)先對整張圖進行旋轉(zhuǎn),通過觀察旋轉(zhuǎn)后的圖像可以發(fā)現(xiàn),有一部分圖像被旋轉(zhuǎn)出了圖像邊界,如果你要摳取的目標正好在圖像邊緣附近,那么很容易出界導致圖像摳取的缺失。同時我們需要對寬、高和角度做出動態(tài)的調(diào)整;透視變換的方法直接對摳取區(qū)域進行了映射,這種方法可以省略旋轉(zhuǎn)的步驟,并且不會出現(xiàn)摳取內(nèi)容的缺失。同時我們只需要對4個頂點之間的映射關(guān)系做好定義即可,不需要考慮角度的問題。相對的,透視變換相對于仿射變換計算量更大一些,不過這在 c++ 的底層實現(xiàn)上帶來的時延差距小于 ms 。

1.圖像裁剪、加邊框、旋轉(zhuǎn)(Python PIL)

? 日常工作中經(jīng)常要用Photoshop打印一些地質(zhì)圖,雖然說PS有動作錄制的功能,但是打印這個功能我嘗試過錄制動作后并未能成功運行,而且要打印的圖像尺寸很多都是不同的,試了幾次后就放棄了,直到后來Python學起來了,通過pywinauto庫實現(xiàn)了這個功能,在這里就簡單記錄下吧。

? ? 在寫Photoshop的打印操作之前,先來回顧下打印之前的圖像處理工作。

? ? 接到的地質(zhì)圖多為MapGIS程序?qū)С龅膉pg圖片,偶爾也會有Tif格式的遙感圖。對這些圖像進行打印很簡單,基本流程是:用PS打開圖像-裁剪圖像四周空白邊緣-為圖像四周加上3cm寬白色邊框(為了美觀和裝訂的需要)-打印。那為啥用PS來打印不直接用Windows自帶打印呢,應(yīng)該是打印需要用到PS特定的顏色處理模式吧,經(jīng)過試驗,通過兩種方式打出來的色彩效果確實是不同的。

? 打印前圖像處理的主要目標很簡單:

? ? ? ? ? ? 1、裁剪圖像四周空白

? ? ? ? ? ? 2、為圖像四周加上3cm白色邊框? ?

下面就用Python實現(xiàn)它們

圖像處理主要用的是PIL這個庫,中途由于單位電腦比較舊(4g內(nèi)存Win7 32位系統(tǒng),后來重裝成64位了,體驗就是搞這種東西必須整個64位系統(tǒng)),性能不太行了,也用Opencv整了下,還是感覺PIL稍微快那么一點點,不知道是不是錯覺呢。

(后來發(fā)現(xiàn)這兩步在PS錄個動作也能輕松完成(???))

一、獲取所有圖片路徑

? ? 有時候要打印的圖片會放在好多個不同文件夾里面,要把它們遍歷出來:

import os

二、讀取圖片并裁剪四周空白

import PIL

獲得了圖像尺寸后接下來就要對圖像進行邊緣空白的裁剪了(其實這兩步不分先后順序的):

裁剪的思路是網(wǎng)上搜到的,整理下就是:

1、先把圖像轉(zhuǎn)成灰度模式(值變成單一的0-255以方便判斷,如果要裁剪其他顏色我就不知道了,我這里只要裁掉最常見的由MapGIS導出的標準的白色邊緣)。

2、分別從四個方向掃描圖像,找到四個方向各自第一個灰度值不為255(最純粹的白色(???))的像素,記下它的坐標(i,j)。

3、通過四組坐標大小比較,得到圖像除了四周空白區(qū)域外的坐標極值,也就得到了裁剪的區(qū)域左上(left,top)和右下坐標(right,bottom)。

4、利用PIL.Image.crop(),完成圖像的裁剪。

5、沒了,就是后來發(fā)現(xiàn)PIL自帶這個算法,引用一下: 使用PIL裁剪圖片白邊

? ? 要是用PS來做呢,‘圖像-裁切-確定’就完事了。

三、給裁剪后的圖像加上x厘米的白色邊框

這一步主要是為了打印出來的圖規(guī)范且美觀。

這一步要是用PS來搞,‘圖像-畫布大小-設(shè)置相對的寬度和高度’ 就好了

四、判斷圖像是否需要旋轉(zhuǎn)。

為什么要旋轉(zhuǎn)這些圖像呢?因為最終是要把它們用打印機打印出來,而打印機能打印的最大寬度是有限的,所以就有了這個步驟。

單位的打印機型號是惠普的HP DesignJet Z6200 60 英寸照片打印機,最大打印紙張寬度是60英寸,大約就是1524mm左右吧,除了最大尺寸外,日常還用到的紙張寬度有440、610、914、1067、1274等6、7種吧,所以出于節(jié)約打印時間和省錢的考慮,為每張圖選擇最合適的打印紙張寬度也是很有必要的。

判斷圖像是否需要旋轉(zhuǎn)的思路是這樣的:

1、比較圖像的寬和高,判斷誰是圖像的長邊和短邊。

2、短邊如果大于1524mm,這圖按1:1就打不出來了,超過打印機最大可裝入的紙張的寬度,把這個圖像文件放到Oversize_path路徑下,后續(xù)自己看著辦。

3、在短邊小于等于1524mm的前提下,根據(jù)對圖像寬高和長短邊的比較,有兩種需要旋轉(zhuǎn)的情況:

? ? ? ? 3.1 如果圖像的寬是長邊(矮胖的矩形),且寬大于1524mm,那么這圖得旋轉(zhuǎn)90°;

? ? ? ? 3.2 如果圖像的高是長邊(瘦高的矩形),且高小于1524mm,那么這圖也得旋轉(zhuǎn)90°。

*printTOtkinter()是個用tkinter搞的進度顯示窗口,就輸出下一些文本信息而已。

五、為圖像選擇最合適的打印紙張尺寸

單位打印紙有438、610、914、1524等7種寬度,現(xiàn)在要選出最適合的一種來進行打印。

在把短邊大于1524這種情況排除之后,剩下的圖像情況為短邊小于1524,即單位的打印機能打印出來了。

這時要判斷最佳打印用紙的寬度,有兩種情況需要考慮:

1、長邊>1524,改用短邊來比較選擇打印紙寬度。

2、長邊 ≤ 1524,用長邊來比較選擇打印紙寬度。

下面思路就是把要用作比較的邊長放入紙張寬度列表,把列表排序后找到比這個邊長大一點的那個紙張寬度。

主要的步驟就是這些,再經(jīng)過一頓復(fù)制粘貼完善一下其他細節(jié)之后,最后會得到一個存放打印信息的列表,把它用txt存起來,這樣后面的PS批量打印需要的信息就全部搞到手了。最后放個gif。

Python reportlab 之 draw函數(shù)介紹

本節(jié)我們講介紹一下操作canvas時經(jīng)常用的工具API。在后續(xù)教程中我將會對每個工具進行詳細介紹,本文把他們都介紹給大家,方便朋友們開發(fā)之用。

用line和lines方法可以直接在canvas里繪制直線段

用shape方法可以繪制復(fù)雜的形狀

我們可以通過beginText函數(shù)創(chuàng)建text對象,然后可以通過textobject對文本進行格式化處理。最后通過drawText完成最終的繪制工作。

Path對象與Text對象十分相似,他們可以繪制更為復(fù)雜的圖形(文字我們也歸類的圖形里)。

我們還可以使用clipPath來將一個矩形的照片剪裁成圓形的頭像。

ReportLab需要使用 Python Imaging Library(PIL)來處理圖片。

在ReportLab里定力兩種繪制圖形的方法,我們建議您采用drawImage方法,因為該方法擁有緩存機制,可以提供繪制效率。另外的方法是drawInlineImage,這個方法古老,該方法通過page stream方式存在位圖,如果您反復(fù)使用一張圖片,該方法每次都要重新繪制,從而造成性能低下的問題。不過如果您的照片很少而且較少使用,那么drawInlineImage方法也是非??焖俚?。

我們先看看古老的方法

drawInlineImage可以在canvas上繪制圖片。image參數(shù)既可以是PIL對象也可以是圖片的地址。ReportLab接受大部分常用圖片文件格式,例如GIF或JPEG。這個函數(shù)最終返回一個 tuple(組),其中包含圖片width和height

drawImage的參數(shù)和返回值與drawInlineImage基本一樣。然后,drawImage卻自帶了緩存系統(tǒng)。當您第一次使用圖片時,系統(tǒng)會將image引用存入序列中。如果您第二次使用時,系統(tǒng)會根據(jù)文件名取隊列中查找,如果您用PIL對象,系統(tǒng)還會檢測PIL的內(nèi)容是否變更。

mask參數(shù)可幫助您創(chuàng)建一個透明的圖形。他有個6個參數(shù)可以擁有絕對RGB那個顏色被掩蓋或透明。

例如

他將使用1或0 來遮蓋紅色,40或41來覆蓋綠色。

showPage()方法將把所有內(nèi)容繪制到頁面中。


分享題目:剪裁函數(shù)python python裁剪不規(guī)則區(qū)域
標題網(wǎng)址:http://www.weahome.cn/article/dojgpeo.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部