OpenCV(02)圖像顏色處理,灰度化,二值化,仿射變換

【OpenCV(01)】基本圖像操作、繪制,讀取視頻

目錄

  • 圖像顏色加法
  • 灰度化
  • 二值化
  • 仿射變換

圖像顏色加法

  • 顏色加法
import cv2 as cv
import numpy as np#讀圖
cao = cv.imread('E:\hqyj\code\opencv\images\cao.png')
pig = cv.imread('E:\hqyj\code\opencv\images\pig.png')
#飽和操作 cv.add(img1,img2) np.uint8
dst1 = cv.add(cao,pig)
#numpy直接相加 取模運算 對256取模 250+10=4
dst2 = cao+pig
# print(cao)
# print(pig)
# print(dst1)
cv.imshow('dst1',dst1)
cv.imshow('dst2',dst2)x = np.uint8([[250]])
y = np.uint8([[10]])
xy1 = cv.add(x,y)
xy2 = x+y
print(xy1)
print(xy2)dst3 = cv.addWeighted(cao,0.2,pig,0.8,0)
cv.imshow('dst3',dst3)cv.waitKey(0)
cv.destroyAllWindows()
  • 圖像轉換
import cv2 as cv
import numpy as np# 讀取圖片
img = cv.imread('E:\hqyj\code\opencv\images\pig.png')
# 顏色轉換 cv.cvtColor(img, cv.COLOR_BGR2HSV)->圖像,轉換方式
# 灰度圖
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
cv.imshow('gray',gray)
# 轉hsv
hsv = cv.cvtColor(img,cv.COLOR_BGR2HSV)
cv.imshow('hsv',hsv)
# bgr轉rgb
rgb = cv.cvtColor(img,cv.COLOR_BGR2RGB)
cv.imshow('rgb',rgb)cv.waitKey(0)
cv.destroyAllWindows()

灰度化

  • 最大值法
import cv2 as cv
import numpy as np#讀取圖像
pig = cv.imread('E:\hqyj\code\opencv\images\pig.png')
shape = pig.shape   #(h,w,c)
img = np.zeros((shape[0],shape[1]),dtype = np.uint8)
#for循環遍歷像素點
for i in range(shape[0]):for j in range(shape[1]):img[i,j] = max(pig[i,j,0],pig[i,j,1],pig[i,j,2])
cv.imshow('grey',img)
cv.waitKey(0)
cv.destroyAllWindows()
  • 平均值法
import cv2 as cv
import numpy as np#讀取圖像
pig = cv.imread('E:\hqyj\code\opencv\images\pig.png')
shape = pig.shape   #(h,w,c)
img = np.zeros((shape[0],shape[1]),dtype = np.uint8)
#for循環遍歷像素點
for i in range(shape[0]):for j in range(shape[1]):#將int():轉換為更大的類型,防止溢出img[i,j] =np.uint8((int(pig[i,j,0])+int(pig[i,j,1])+int(pig[i,j,2]))/3)
cv.imshow('grey',img)
cv.waitKey(0)
cv.destroyAllWindows()
  • 加權平均值法
import cv2 as cv
import numpy as np#讀取圖像
pig = cv.imread('E:\hqyj\code\opencv\images\pig.png')
shape = pig.shape   #(h,w,c)
img = np.zeros((shape[0],shape[1]),dtype = np.uint8)
#定義權重
wb,wg,wr = 0.114,0.587,0.299
#for循環遍歷像素點
for i in range(shape[0]):for j in range(shape[1]):#將int():轉換為更大的類型,防止溢出img[i,j] = round((wb * pig[i,j,0] + wg * pig[i,j,1] + wr * pig[i,j,2])//3)cv.imshow('grey',img)
cv.waitKey(0)
cv.destroyAllWindows()

二值化

  • 二值化(閾值法)格式:閾值法:
    _,binary = cv2.threshold(img,thresh,maxval,type)
    _binary:cv2.threshold 函數返回兩個值:一個是計算出的最佳閾值(retval),另一個是閾值處理后的圖像(binary),_ 被用來忽略返回值中的第一個元素,即計算出的最佳閾值
    img:輸入圖像,要進行二值化處理的灰度圖。
    thresh:設定的閾值。當像素值大于(或小于,取決于閾值類型)thresh時,該像素被賦予的值。
    type:閾值處理的類型。
  • 自適應二值化格式:
    cv2.adaptiveThreshold(image_np_gray, maxval, adaptiveMethod, thresholdType, blockSize, c)
    其中各個參數的含義如下:
    maxval:最大閾值,一般為255
    adaptiveMethod:小區域閾值的計算方式:
    ADAPTIVE_THRESH_MEAN_C:小區域內取均值
    ADAPTIVE_THRESH_GAUSSIAN_C:小區域內加權求和,權重是個高斯核
    thresholdType:二值化方法,只能使用THRESH_BINARY、THRESH_BINARY_INV,也就是閾值法和反閾值法
    blockSize:選取的小區域的面積,如7就是7*7的小塊。(只能取奇數)
    c:最終閾值等于小區域計算出的閾值再減去此值
import cv2 as cv#讀圖
flower = cv.imread('E:\hqyj\code\opencv\images\\flower.png')
#灰度化處理
gray = cv.cvtColor(flower,cv.COLOR_BGR2GRAY)
gray = cv.resize(gray,(360,360))
cv.imshow('1.gray',gray)#二值化 1.閾值法  cv.THRESH_BINARY
thresh,binary = cv.threshold(gray,127,255,cv.THRESH_BINARY)
print(thresh)
cv.imshow('2.binary',binary)#2.反閾值法   cv.THRESH_BINARY_INV
_,binary_inv = cv.threshold(gray,127,255,cv.THRESH_BINARY_INV)
cv.imshow('3.binary_inv',binary_inv)#3.截斷閾值法 cv.THRESH_TRUNC
_,binary_trunc = cv.threshold(gray,170,255,cv.THRESH_TRUNC)
cv.imshow('4.binary_trunc',binary_trunc)#4.低閾值零處理法 cv.THRESH_TOZERO
_,binary_tozero = cv.threshold(gray,127,255,cv.THRESH_TOZERO)
cv.imshow('5.binary_tozero',binary_tozero)#5.超閾值零處理法 cv.THRESH_TOZERO_INV
_,binary_tozero_inv = cv.threshold(gray,127,255,cv.THRESH_TOZERO_INV)
cv.imshow('6.binary_tozero_inv',binary_tozero_inv)#6.OTSU閾值法
shresh1,otsu=cv.threshold(gray,200,255,cv.THRESH_OTSU)
#7.OTSU+反閾值法
shresh2,otsu_inv = cv.threshold(gray,shresh1,255,cv.THRESH_BINARY_INV)
print(shresh1)
print(shresh2)
cv.imshow('7.otsu',otsu)#自適應二值化 小區域計算 必須只能結合閾值法或反閾值法
#1.取均值
binary_adaptive = cv.adaptiveThreshold(gray,255,cv.ADAPTIVE_THRESH_MEAN_C,cv.THRESH_BINARY,7,10)
#2.加權求和法 高斯核
adaptive_binary = cv.adaptiveThreshold(gray,255,cv.ADAPTIVE_THRESH_GAUSSIAN_C,cv.THRESH_BINARY,11,10)
cv.imshow('8.binary_adaptive',binary_adaptive)
cv.imshow('9.adaptive_binary',adaptive_binary)cv.waitKey(0)
cv.destroyAllWindows()

仿射變換

  • 仿射變換流程
    1.讀圖cv.imread(),調尺寸cv.resize()
    2.獲取仿射變換矩陣
1.旋轉:M = cv.getRotationMatrix2D(center,angle,scale) center:旋轉中心點的坐標,格式為`(x,y)`。angle:旋轉角度,單位為度,正值表示逆時針旋轉負值表示順時針旋轉。scale:縮放比例,若設為1,則不縮放。
2.平移:M = np.float32([[1,0,tx],[0,1,ty]])
3.縮放:M = np.float32([[sx,0,0],[0,sy,0]])
4.剪切:M = np.float32([[shx,1,0],[1,shy,0]])
  • 旋轉
import cv2 as cv#讀圖
cat = cv.imread('E:\hqyj\code\opencv\images\\cat1.png')
cat = cv.resize(cat,(520,520))
#獲取旋轉矩陣 cvv2.getRotationMatrix2D(center,angle,scale) 2x3
M = cv.getRotationMatrix2D((260,260),-45,1)
#仿射變換函數 cv.warpAffine(img,M,(w,h))
img = cv.warpAffine(cat,M,(520,520))
cv.imshow('img',img)
cv.waitKey(0)
cv.destroyAllWindows()
  • 平移
import cv2 as cv
import numpy as np#讀圖
cat = cv.imread('E:\hqyj\code\opencv\images\\cat1.png')
cat = cv.resize(cat,(520,520))
#定義平移量
tx,ty = 80,120
#定義平移矩陣
M = np.float32([[1,0,tx],[0,1,ty]])
#仿射變換函數 M = cv.warpAffine(img,M,(w,h))
img = cv.warpAffine(cat,M,(520,520))
cv.imshow('img',img)
cv.waitKey(0)
cv.destroyAllWindows()
  • 縮放
import cv2 as cv
import numpy as np#讀圖
cat = cv.imread('E:\hqyj\code\opencv\images\\cat1.png')
cat = cv.resize(cat,(520,520))
#定義縮放量
sx,sy = 0.5,0.5
#定義縮放矩陣
M = np.float32([[sx,0,0],[0,sy,0]])
#仿射變換函數 cv.warpAffine(img,M,(w,h))
img = cv.warpAffine(cat,M,(520,520))
cv.imshow('img',img)
cv.waitKey(0)
cv.destroyAllWindows()
  • 剪切
import cv2 as cv
import numpy as np#讀圖
cat = cv.imread('E:\hqyj\code\opencv\images\\cat1.png')
cat = cv.resize(cat,(520,520))
#定義縮放量
shx,shy = 0.5,0.5
#定義縮放矩陣
M = np.float32([[shx,1,0],[1,shy,0]])
#仿射變換函數 cv.warpAffine(img,M,(w,h))
img = cv.warpAffine(cat,M,(520,520))
cv.imshow('img',img)
cv.waitKey(0)
cv.destroyAllWindows()

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

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

相關文章

嵌入式——單片機的獨立按鍵

一、目的功能通過開發板上的獨立按鍵k1控制d1指示燈亮滅,k1一次亮再按一次滅。二、硬件原理圖三、消抖理解(一)核心原理:當事件被重復觸發時,設置一個延遲,只有在該時間內沒有新的事件被觸發,才…

機器學習的工作流程

🌟 歡迎來到AI奇妙世界! 🌟 親愛的開發者朋友們,大家好!👋 我是人工智能領域的探索者與分享者,很高興在CSDN與你們相遇!🎉 在這里,我將持續輸出AI前沿技術、實…

聚類里面的一些相關概念介紹闡述

一、性能度量外部指標:聚類結果與某個“參考模型”進行比較;系數: ,其中的 表示樣本是否屬于某類簇; 指數:,其中 表示樣本在兩個聚類結果中都是同一類簇, 表示在其中一個聚類結果中…

mmap機制

先看這個 MMAP 機制通俗易懂-CSDN博客 一句話 **mmap(memory map)是操作系統提供的“把文件或設備直接映射到進程虛擬地址空間”的機制,Java 里對應 `MappedByteBuffer`。** --- ### 1. 技術本質 - 系統調用:`mmap()`(POSIX)、`CreateFileMapping`(Windows)。 …

嵌入式硬件篇---驅動板

制作 ESP32 驅動板的核心是 “搭建 ESP32 與外設之間的橋梁”—— 因為 ESP32 的 GPIO 引腳輸出電流很小(最大 20mA),無法直接驅動大功率設備(如電機、繼電器、電磁閥等),驅動板的作用就是放大電流 / 功率&…

UniappDay01

1.技術架構2.創建uniapp項目 通過HBuilderX創建 官網安裝創建uniapp vue3項目安裝uniapp vue3的編譯器在工具欄啟動微信小程序開啟服務端口模擬器窗口分離和置頂 通過命令行創建 3.pages.json和tabbar案例 pages.json用來配置路由,導航欄,tabbar等頁面類…

子空間投影,投影矩陣,最小二乘法

一、子空間投影 1.1 投影與誤差向量b 在 向量a 上的投影即 a 上離 b 最近的點: paTbaTaa p \frac{a^T b}{a^Ta}a paTaaTb?a 我們記 誤差 e b - p,顯然誤差e 和 a 是正交的。 1.2 投影矩陣向量b 在子空間S上的投影是S中離b 最近的向量p。 我們做如下推…

基于FPGA的SPI控制FLASH讀寫

基于FPGA的SPI控制FLASH讀寫 文章目錄基于FPGA的SPI控制FLASH讀寫一、SPI簡介二、FLASH_M25P16簡介信號描述功能操作注意時序三、設計思路框圖設計狀態機設計四、上板驗證1、讀ID2、讀數據3、扇區擦除寫數據五、總結六、代碼一、SPI簡介 SPI是Serial Peripheral interface的縮…

Pytest 參數化進階:掌握 parametrize 的多種用法

概述 在自動化測試中,@pytest.mark.parametrize 不僅僅能用來為測試函數提供多組輸入數據,還能配合其他功能實現更復雜的測試邏輯。本文將帶你深入了解 @pytest.mark.parametrize 的多種常見用法,助你在不同場景下寫出更高效、更清晰的測試代碼 基礎用法回顧:單個參數化 …

K8S 九 安全認證 TLS

目錄第九章 安全認證訪問控制概述認證管理授權管理 RBACRBACRolerules中的參數RoleBinding9.4 準入控制其他K8S的TLS是什么(DeepSeek)1. 加密通信2. 身份認證(Authentication)3. 數據完整性K8s 中 TLS 的具體應用**1. API Server …

積分兌換小程序Java

某個學校為了激勵學生踴躍參加一些社會實踐活動,會對參與者給予一些校園積分,學生們獲得校園積分后可以使用校園積分在指定的老師那兌換一些學習用具,當前可兌換的物品和對應的積分數量如下:鉛筆1分橡皮2分作業本3分文具盒5分為了…

函數指針示例

使用函數指針來調用 printf。下面是對代碼的詳細解釋&#xff1a;&#x1f4c4; 源代碼解析#include <stdio.h>int main() {int (*myshow)(const char *, ...); // 聲明一個函數指針&#xff0c;指向可變參數函數printf("hello world!\n");myshow printf; /…

不坑盒子突然不見了怎么辦?

如果你安裝后之前一切正常&#xff0c;突然某天在Office的功能區看不到不坑盒子了&#xff0c;這種是插件被禁用了&#xff0c;重裝安裝插件、Office都是不能解決的&#xff0c;必須按下面的方法解決。WPS中1.隨便打開一個文檔&#xff0c;點擊文件-選項-信任中心&#xff0c;最…

Java面試全棧通關:從微服務到AI的技術深度解析

Java面試全棧通關&#xff1a;從微服務到AI的技術深度解析 面試現場&#xff1a;大廠技術終面室 面試官&#xff1a;謝飛機同學&#xff0c;今天我們將從基礎到架構&#xff0c;全面考察你的Java技術棧掌握程度。請真實展示你的技術水平。 謝飛機&#xff1a;&#xff08;挺胸抬…

《Java 程序設計》第 7 章 - 繼承與多態

引言在 Java 面向對象編程中&#xff0c;繼承與多態是兩大核心特性&#xff0c;它們共同支撐了代碼的復用性、擴展性和靈活性。本章將從繼承的基本實現開始&#xff0c;逐步深入到方法覆蓋、訪問控制、抽象類等概念&#xff0c;最終揭示多態的本質與應用。通過大量可運行的代碼…

ksql連接數據庫免輸入密碼交互

ksql連接數據庫免輸入密碼交互1. 使用 .pgpass 文件&#xff08;推薦&#xff09;2. 使用環境變量3. 使用連接字符串4. 修改 ksql 的別名&#xff08;簡化命令&#xff09;5. 注意事項6. 密碼含特殊字符轉義在 Kingbase 中使用 ksql 連接數據庫時&#xff0c;如果希望避免每次手…

UniApp H5 適配 PC 端新姿勢:打造跨設備一致體驗

在移動互聯網蓬勃發展的今天&#xff0c;很多開發者會選擇使用 UniApp 來開發多端應用&#xff0c;尤其是 H5 端&#xff0c;因其無需下載安裝即可訪問的特性&#xff0c;深受用戶喜愛。但 UniApp H5 應用在 PC 端直接打開時&#xff0c;往往會因為屏幕尺寸的巨大差異&#xff…

【MySQL#4】函數 復合查詢 內外連接

&#x1f4c3;個人主頁&#xff1a;island1314 ?? 歡迎關注&#xff1a;&#x1f44d;點贊 &#x1f442;&#x1f3fd;留言 &#x1f60d;收藏 &#x1f49e; &#x1f49e; &#x1f49e; 生活總是不會一帆風順&#xff0c;前進的道路也不會永遠一馬平川&#xff0c;如何面…

C++常見面試題之一

一、語言基礎與內存管理const與constexpr的區別&#xff1f;應用場景&#xff1f; const&#xff1a;運行時常量&#xff0c;修飾變量/函數不可修改。constexpr&#xff1a;編譯期常量&#xff08;C11&#xff09;&#xff0c;用于優化計算&#xff08;如數組大小&#xff09;。…

Golang 語言中的指針介紹

介紹&#xff1a;指針式一種數據類型&#xff0c;用來存儲值的內存地址&#xff0c;為了便于理解&#xff0c;我們也可以把指針未內存地址&#xff0c;指針類型只占用內存4個或 8 個字節&#xff0c;在Golang 語言中&#xff0c;類型名稱加 * 表示改類型的指針類型。指針類型變…