OpenCV 4基礎篇| OpenCV圖像的裁切

目錄

  • 1. Numpy切片
    • 1.1 注意事項
    • 1.2 代碼示例
  • 2. cv2.selectROI()
    • 2.1 語法結構
    • 2.2 注意事項
    • 2.3 代碼示例
  • 3. Pillow.crop
    • 3.1 語法結構
    • 3.2 注意事項
    • 3.3 代碼示例
  • 4. 擴展示例:單張大圖裁切成多張小圖
  • 5. 總結

1. Numpy切片

語法結構:

retval = img[y:y+h, x:x+w] #對圖像 img 裁剪并返回指定的矩陣區域圖像。
  • img:圖像數據,nparray 多維數組
  • x, y:整數,像素值,裁剪矩形區域左上角的坐標值
  • w, h:整數,像素值,裁剪矩形區域的寬度、高度
  • retval:裁剪后獲得的 OpenCV 圖像,nparray 多維數組

1.1 注意事項

  • Numpy 多維數組的切片是原始數組的淺拷貝,切片修改后原始數組也會改變。推薦采用 .copy() 進行深拷貝,得到原始圖像的副本。
  • Numpy 數組切片,當上界或下界為數組邊界時可以省略,如:img[y:, :x] 表示高度方向從 y 至圖像底部(像素ymax),寬度方向從圖像左側(像素 0)至 x。

1.2 代碼示例

import cv2imgFile = "./img/lena.jpg"
img1 = cv2.imread(imgFile, flags=1)  # flags=1 讀取彩色圖像(BGR)
xmin, ymin, w, h = 200, 200, 200, 200  # 矩形裁剪區域 (ymin:ymin+h, xmin:xmin+w) 的位置參數
imgCrop = img1[ymin:ymin + h, xmin:xmin + w].copy()  # 切片獲得裁剪后保留的圖像區域
cv2.imshow("CropDemo", imgCrop)  # 在窗口顯示 彩色隨機圖像
cv2.waitKey(0)
cv2.destroyAllWindows()

1

2. cv2.selectROI()

2.1 語法結構

cv2.selectROI(windowName, img, showCrosshair=None, fromCenter=None):#可以通過鼠標選擇感興趣的矩形區域(ROI)
  • windowName:選擇的區域被顯示在的窗口的名字
  • img:要在什么圖片上選擇ROI
  • showCrosshair:是否在矩形框里畫十字線.
  • fromCenter:是否是從矩形框的中心開始畫

2.2 注意事項

  • 由于 cv2.selectROI 是一個交互式的函數,它可能不適合用于自動化腳本或沒有圖形用戶界面的環境。在這種情況下,你可能需要尋找其他方法來選擇圖像中的 ROI,例如使用固定坐標、圖像分割算法等。

2.3 代碼示例

import cv2imgFile = "img/lena.jpg"  
img1 = cv2.imread(imgFile, flags=1)  # flags=1 讀取彩色圖像(BGR)
roi = cv2.selectROI(img1, showCrosshair=True, fromCenter=False)
xmin, ymin, w, h = roi  # 矩形裁剪區域 (ymin:ymin+h, xmin:xmin+w) 的位置參數
imgROI = img1[ymin:ymin + h, xmin:xmin + w].copy()  # 切片獲得裁剪后保留的圖像區域
cv2.imshow("RIODemo", imgROI)
cv2.waitKey(0)
cv2.destroyAllWindows()

1

3. Pillow.crop

3.1 語法結構

retval = Image.crop(left, up, right, lower) #可以通過鼠標選擇感興趣的矩形區域(ROI)
  • left: 整數,表示裁剪區域左上角的 x 坐標。
  • up:整數,表示裁剪區域左上角的 y 坐標。
  • right:整數,表示裁剪區域右下角的 x 坐標。這個值通常大于 left。
  • below:整數,表示裁剪區域右下角的 y 坐標。這個值通常大于 upper。
  • retval:一個新的 Image 對象,原始圖像中被裁剪出來的矩形區域

3.2 注意事項

  • crop()函數接受一個包含四個數字的元組參數,表示裁剪區域的左上角和右下角的坐標。這個元組的格式是(left, upper, right, lower),其中left和upper是裁剪區域的左上角坐標,right和lower是右下角坐標。坐標的原點(0,0)通常在圖像的左上角。
  • Pillow庫使用坐標系的原點在左上角,x軸向右增加,y軸向下增加。這與一些其他圖像處理庫(如OpenCV)的坐標系原點在左下角的約定不同,需要注意坐標的順序和方向。
  • 裁剪區域的坐標必須在圖像的邊界內。如果裁剪區域的坐標超出了圖像的邊界,將會引發一個ValueError異常。因此,在調用crop()函數之前,最好先檢查裁剪區域的坐標是否有效。
  • crop()函數不會修改原始圖像,而是返回一個新的裁剪后的圖像對象。原始圖像保持不變,如果需要保存裁剪后的圖像,需要將其保存到文件或進行其他操作。

3.3 代碼示例

from PIL import Image
import matplotlib.pyplot as pltimgFile = "./img/lena.jpg"
img = Image.open(imgFile)  # W*H
plt.rcParams['font.sans-serif'] = ['FangSong']  # 支持中文標簽
plt.subplot(221), plt.title("原圖"), plt.axis('off')
plt.imshow(img)  
img_c = img.crop([img.size[0] / 4, img.size[1] / 4, img.size[0] * 3 / 4, img.size[1] * 3 / 4])
plt.rcParams['font.sans-serif'] = ['FangSong']  # 支持中文標簽
plt.subplot(222), plt.title("裁切之后"), plt.axis('off')
plt.imshow(img_c)  
plt.show()

11

4. 擴展示例:單張大圖裁切成多張小圖

from PIL import ImageimgFile = "./img/lena.jpg"
img = Image.open(imgFile)
size = img.size
print(size)
# 準備將圖片切割成9張小圖片
weight = int(size[0] // 3)
height = int(size[1] // 3)
# 切割后的小圖的寬度和高度
print(weight, height)
for j in range(3):for i in range(3):box = (weight * i, height * j, weight * (i + 1), height * (j + 1))region = img.crop(box)region.save('{}{}.png'.format(j, i))

1

5. 總結

  • Numpy切片和Pillow.crop()都是非交互式的裁剪方法,適用于在代碼中直接指定裁剪區域。
  • cv2.selectROI()是一個交互式的裁剪方法,允許用戶通過圖形界面選擇ROI。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/716615.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/716615.shtml
英文地址,請注明出處:http://en.pswp.cn/news/716615.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

以目標檢測和分類任務為例理解One-Hot Code

在目標檢測和分類任務中,每一個類別都需要一個編碼來表示,同時,這個編碼會用來計算網絡的loss。比如有貓,狗,豬三種動物,這三種動物相互獨立,在分類中,將其中任意一種分類為其他都同…

YOLOv9獨家原創改進|使用可改變核卷積AKConv改進RepNCSPELAN4

專欄介紹:YOLOv9改進系列 | 包含深度學習最新創新,主力高效漲點!!! 一、改進點介紹 AKConv是一種具有任意數量的參數和任意采樣形狀的可變卷積核,對不規則特征有更好的提取效果。 RepNCSPELAN4是YOLOv9中的…

前端架構: 腳手架通用框架封裝之啟動檢查功能開發(教程四)

腳手架啟動前的檢查功能開發 接上文,仍舊在 abc-cli 項目中參考:https://blog.csdn.net/Tyro_java/article/details/136431320現在要在腳手架啟動前要做一些邏輯,可以在 hook 鉤子函數中去書寫比如,進行node版本的對比&#xff0…

2023年12月CCF-GESP編程能力等級認證Scratch圖形化編程四級真題解析

一、單選題(共15題,共30分) 第1題 現代計算機是指電子計算機,它所基于的是( )體系結構。 A:艾倫圖靈 B:馮諾依曼 C:阿塔納索夫 D:埃克特-莫克利 答案:B 第2題 默認小貓角色,執行下列程序,以下說法正確的是? ( ) A:舞臺上會出現無數個小貓 B:舞臺只會出現…

java spring 02. AbstractApplicationContext

spring創建對象的順序,先創建beanfactory,再會把xml文件讀取到spring。 public ClassPathXmlApplicationContext(String[] configLocations, boolean refresh, Nullable ApplicationContext parent)throws BeansException {//調用父類的構造方法super(p…

Redis常用指令,jedis與持久化

1.redis常用指令 第一個是key的常用指令,第二個是數據庫的常用指令 前面的那些指令都是針對某一個數據類型操作的,現在的都是對所有的操作的 1.key常用指令 key應該設計哪些操作 key是一個字符串,通過key獲取redis中保存的數據 對于key…

flink重溫筆記(九):Flink 高級 API 開發——flink 四大基石之WaterMark(Time為核心)

Flink學習筆記 前言:今天是學習 flink 的第 9 天啦!學習了 flink 四大基石之 Time的應用—> Watermark(水印,也稱水位線),主要是解決數據由于網絡延遲問題,出現數據亂序或者遲到數據現象&…

通過大語言模型理解運維故障:評估和總結

張圣林 南開大學軟件學院副教授、博士生導師 第六屆CCF國際AIOps挑戰賽程序委員會主席 在ATC、WWW、VLDB、KDD、SIGMETRICS等國際會議和JSAC、TC、TSC等國際期刊發表高水平論文50余篇。主持國家自然科學基金項目2項,橫向項目13項(與華為、字節跳動、騰訊…

Sqli-labs靶場第20關詳解[Sqli-labs-less-20]自動化注入-SQLmap工具注入

Sqli-labs-Less-20 通過測試發現,在登錄界面沒有注入點,通過已知賬號密碼admin,admin進行登錄發現: 登錄后會有記錄 Cookie 值 設想如果在Cookie嘗試加上注入語句(報錯注入),測試是否會執行…

C++STL之vector

vector 1. vector介紹 vector文檔vector其實就是一個順序表,它表示可變大小數組的序列容器。像數組一樣,可以使用下標[] 來訪問vector的元素,和數組一樣高效;甚至,它的大小是可以動態改變的,其大小由容器自…

printf() 函數支持變長參數列表

printf() 函數也支持變長參數列表&#xff0c;可以使用省略號 … 來表示&#xff0c;用于指定要輸出的多個值。在函數內部&#xff0c;可以使用 va_start() 和 va_end() 宏來訪問變長參數列表中的值。例如&#xff1a; #include <stdio.h> #include <stdarg.h>voi…

軟考55-上午題-【數據庫】-數據庫設計步驟1

一、數據庫設計的步驟 新奧爾良法&#xff0c;四個主要階段&#xff1a; 1、用戶需求分析&#xff1a;手機用戶需求&#xff0c;確定系統邊界&#xff1b; 2、概念設計&#xff08;概念結構設計&#xff09;&#xff1a;是抽象概念模型&#xff0c;較理想的是采用E-R方法。 …

深度學習:開啟你的AI探索之旅

在這個信息爆炸的時代,人工智能(AI)已經滲透到我們生活的方方面面,從智能語音助手到自動駕駛汽車,從智能推薦系統到醫療影像診斷,AI的身影無處不在。而深度學習,作為AI領域的一大核心技術,更是引領著這場科技革命的浪潮。那么,如何入門深度學習,踏上這趟充滿挑戰與機…

深入Gradle:初識構建自動化的魅力

在軟件開發的世界中&#xff0c;構建工具是不可或缺的一部分。它們幫助我們自動化編譯、測試和打包應用程序的過程&#xff0c;從而節省時間并減少錯誤。在眾多構建工具中&#xff0c;Gradle以其靈活性、可擴展性和卓越的性能而脫穎而出。本篇文章將帶你走進Gradle的世界&#…

代碼隨想錄算法訓練營第七天

● 自己看到題目的第一想法 第454題.四數相加II 方法&#xff1a; 方法一&#xff1a; 暴力法 思路&#xff1a; 注意&#xff1a; 代碼&#xff1a; class Solution { public:int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<i…

QT 網絡編程 8

1 基礎知識 udp tcp 2 UDP 框架 客戶端: QUdpSocket x; qint64 writeDatagram( const char *data, qint64 size, const QHostAddress &address, quint16 port );服務器: void Server::initSocket(){udpSocket new QUdpSocket(this);udpSocket->bind(QHostAddress…

macos jupyter notebook字體的修改

終端codemirror 記事本打開 搜索font-family 修改font-size保存即可

重學SpringBoot3-@ConditionalOnXxx條件注解

重學SpringBoot3-ConditionalOnXxx條件注解 引言常見的條件注解常見的條件注解示例擴展條件注解1. ConditionalOnJndi2. ConditionalOnJava3. ConditionalOnCloudPlatform4. ConditionalOnEnabledResourceChain5. 自定義條件注解 總結 引言 Spring Boot 提供了一組強大的條件注…

ERDAS監督分類與溫度反演教程

本期帶來監督分類教程&#xff0c;更多內容&#xff0c;歡迎關注小編的公眾號梧桐涼月哦&#xff01;&#xff01;&#xff01; 一、研究區自然、地理環境特征&#xff1a; 1、景德鎮市位于中國江西省東北部&#xff0c;地處贛江中游的贛北盆地&#xff0c;地形地貌以丘陵和低…

mitmproxy代理

文章目錄 mitmproxy1. 網絡代理2. 安裝3. Https請求3.1 啟動mitmproxy3.2 獲取證書3.3 配置代理3.4 運行測試 4. 請求4.1 讀取請求4.2 修改請求4.3 攔截請求 5. 響應5.1 讀取響應5.2 修改響應 6. 案例&#xff1a;共享賬號6.1 登錄bilibili獲取cookies6.2 在代理請求中設置cook…