使用OpenCV在Python中進(jìn)行圖像操作
介紹
眾所周知,OpenCV是一個(gè)用于計(jì)算機(jī)視覺和圖像操作的免費(fèi)開源庫。
OpenCV 是用 C++ 編寫的,并且有數(shù)千種優(yōu)化的算法和函數(shù)用于各種圖像操作。很多現(xiàn)實(shí)生活中的操作都可以使用 OpenCV 來解決。例如視頻和圖像分析、實(shí)時(shí)計(jì)算機(jī)視覺、對(duì)象檢測(cè)、鏡頭分析等。
許多公司、研究人員和開發(fā)人員為 OpenCV 的創(chuàng)建做出了貢獻(xiàn)。使用OpenCV 很簡(jiǎn)單,而且 OpenCV 配備了許多工具和功能。讓我們使用 OpenCV 來執(zhí)行有趣的圖像操作并查看結(jié)果。
形態(tài)變換
形態(tài)變換是基于形狀變換圖像的圖像處理方法。這個(gè)過程有助于區(qū)域形狀的表現(xiàn)和刻畫。這些轉(zhuǎn)換使用應(yīng)用于輸入圖像的結(jié)構(gòu)元素,并生成輸出圖像。
形態(tài)學(xué)操作有多種用途,包括從圖像中去除噪聲、定位圖像中的強(qiáng)度凹凸和孔洞,以及連接圖像中的不同元素。
有兩種主要的形態(tài)學(xué)變換類型:腐蝕和膨脹。
腐蝕
腐蝕是為了減小前景對(duì)象的大小而執(zhí)行的形態(tài)學(xué)操作。異物的邊界被慢慢腐蝕。腐蝕在圖像編輯和轉(zhuǎn)換中有許多應(yīng)用,腐蝕會(huì)縮小圖像像素。對(duì)象邊界上的像素也被刪除。
腐蝕的實(shí)現(xiàn)在 Python 中很簡(jiǎn)單,可以在內(nèi)核的幫助下實(shí)現(xiàn)。
讓我們開始使用 Python 中的代碼來實(shí)現(xiàn)腐蝕。
首先,我們導(dǎo)入 Open CV 和 Numpy。
import cv2
import numpy as np
現(xiàn)在我們讀取圖像。
image = cv2.imread("image1.jpg")
圖片:

我們創(chuàng)建了一個(gè)執(zhí)行腐蝕操作所需的內(nèi)核,并使用內(nèi)置的 OpenCV 函數(shù)實(shí)現(xiàn)它。
# Creating kernel
kernel = np.ones((5, 5), np.uint8)
# Using cv2.erode() method
image_erode = cv2.erode(image, kernel)
現(xiàn)在,我們保存文件并查看。
filename = 'image_erode1.jpg'
# Using cv2.imwrite() method
# Saving the image
cv2.imwrite(filename, image_erode)
圖片:

正如我們所看到的,圖像現(xiàn)在被腐蝕了,銳度和邊緣都減少了,圖像變得模糊了。腐蝕可用于隱藏或刪除圖像的某些部分或隱藏圖像中的信息。
讓我們嘗試不同類型的腐蝕。
kernel2 = np.ones((3, 3), np.uint8)
image_erode2 = cv2.erode(image, kernel2, cv2.BORDER_REFLECT)
現(xiàn)在,我們保存圖像文件。
filename = 'image_erode2.jpg'
# Using cv2.imwrite() method
# Saving the image
cv2.imwrite(filename, image_erode2)
圖片:

現(xiàn)在,讓我們看看什么是膨脹。
膨脹
膨脹過程與腐蝕相反。圖像膨脹時(shí),前景對(duì)象不是縮小,而是擴(kuò)大。圖像里的東西在邊界附近擴(kuò)張,并形成一個(gè)膨脹的物體。
圖像中的明亮區(qū)域在膨脹后往往會(huì)“發(fā)光”,這通常會(huì)導(dǎo)致圖像增強(qiáng)。因此,膨脹用于圖像校正和增強(qiáng)。
讓我們使用 Python 代碼實(shí)現(xiàn) Dilation。
kernel3 = np.ones((5,5), np.uint8)
image_dilation = cv2.dilate(image, kernel, iterations=1)
現(xiàn)在,我們保存圖像。
filename = 'image_dilation.jpg'
# Using cv2.imwrite() method
# Saving the image
cv2.imwrite(filename, image_dilation)
圖片:

正如我們所見,圖像現(xiàn)在更亮,強(qiáng)度更高。
創(chuàng)建邊框
為圖像添加邊框非常簡(jiǎn)單,我們的手機(jī)圖庫應(yīng)用程序或編輯應(yīng)用程序可以非常快速地完成。但是,現(xiàn)在讓我們使用 Python 為圖像創(chuàng)建邊框。
## Using cv2.copyMakeBorder() method
image_border1 = cv2.copyMakeBorder(image, 25, 25, 10, 10,cv2BORDER_CONSTANT, None, value = 0)
現(xiàn)在,讓我們保存圖像。filename = 'image_border1.jpg'
# Using cv2.imwrite() method
# Saving the image
cv2.imwrite(filename, image_border1)
圖片:

在這里,我們?yōu)閳D像添加了一個(gè)簡(jiǎn)單的黑色邊框。現(xiàn)在,讓我們嘗試一些鏡像邊框。
#making a mirrored border
image_border2 = cv2.copyMakeBorder(image, 250, 250, 250, 250, cv2.BORDER_REFLECT)
現(xiàn)在,我們保存圖像。
filename = 'image_border2.jpg'
# Using cv2.imwrite() method
# Saving the image
cv2.imwrite(filename, image_border2)
圖片:

這很有趣,它看起來像是奇異博士的鏡子維度中的東西。
讓我們?cè)囋噭e的。
#making a mirrored border
image_border3 = cv2.copyMakeBorder(image, 300, 250, 100, 50, cv2.BORDER_REFLECT)
現(xiàn)在,我們保存圖像。
filename = 'image_border3.jpg'
# Using cv2.imwrite() method
# Saving the image
cv2.imwrite(filename, image_border3)
圖片:

強(qiáng)度變換
通常,由于各種原因,圖像會(huì)發(fā)生強(qiáng)度變換。這些是在空間域中直接在圖像像素上完成的。圖像閾值處理和對(duì)比度處理等操作是使用強(qiáng)度轉(zhuǎn)換完成的。
對(duì)數(shù)變換
對(duì)數(shù)變換是一種強(qiáng)度變換操作,其中圖像中的像素值被替換為它們的對(duì)數(shù)值。
對(duì)數(shù)變換用于使圖像變亮或增強(qiáng)圖像,因?yàn)樗鼘D像中較暗的像素?cái)U(kuò)大到較高的像素值。
讓我們實(shí)現(xiàn)對(duì)數(shù)變換。
# Apply log transform.
c = 255/(np.log(1 + np.max(image)))
log_transformed = c * np.log(1 + image)
# Specify the data type.
log_transformed = np.a(chǎn)rray(log_transformed, dtype = np.uint8)
現(xiàn)在,我們保存圖像。
cv2.imwrite('log_transformed.jpg', log_transformed)
圖片:

圖像變得非常明亮。
線性變換
我們將對(duì)圖像應(yīng)用分段線性變換。這種變換也是在空間域上完成的。此方法用于為特定目的修改圖像。它被稱為分段線性變換,因?yàn)樗挥幸徊糠质蔷性的。最常用的分段線性變換是對(duì)比拉伸。
通常,如果在低光照條件下單擊圖像并且周圍照明不佳,則生成的圖像對(duì)比度較低。對(duì)比度拉伸會(huì)增加圖像中強(qiáng)度級(jí)別的范圍,并且對(duì)比度拉伸函數(shù)會(huì)單調(diào)增加,從而保持像素強(qiáng)度的順序。
現(xiàn)在,讓我們實(shí)現(xiàn)對(duì)比度拉伸。
def pixelVal(pix, r1, s1, r2, s2):
if (0 <= pix and pix <= r1):
return (s1 / r1)*pix
elif (r1 < pix and pix <= r2):
return ((s2 - s1)/(r2 - r1)) * (pix - r1) + s1
else:
return ((255 - s2)/(255 - r2)) * (pix - r2) + s2
# Define parameters.
r1 = 70
s1 = 0
r2 = 140
s2 = 255
# Vectorize the function to apply it to each value in the Numpy array.
pixelVal_vec = np.vectorize(pixelVal)
# Apply contrast stretching.
contrast_stretch = pixelVal_vec(image, r1, s1, r2, s2)
# Save edited image.
cv2.imwrite('contrast_stretch.jpg', contrast_stretch)
圖片:

在這里,圖像得到了改善,并且可以觀察到更高的對(duì)比度。
去噪彩色圖像
去噪信號(hào)或圖像意味著去除不必要的信號(hào)和信息以獲得有用的信號(hào)和信息。去噪以去除不需要的噪聲,并更好地分析和處理圖像。
讓我們用 Python 對(duì)彩色圖像進(jìn)行去噪。
denoised_image = cv2.fastNlMeansDenoisingColored(image, None, 15, 8, 8, 15)
現(xiàn)在,我們保存圖像。
# Save edited image.
cv2.imwrite('denoised_image.jpg', denoised_image)
圖片:

我們可以看到很多想要的東西,比如背景和天空已經(jīng)被刪除了。
使用直方圖分析圖像
在任何形式的分析中,直方圖都是必不可少的視覺效果。圖像的直方圖是理解全局描述的一種令人興奮的方式,直方圖可用于對(duì)圖像進(jìn)行定量分析。圖像直方圖表示圖像中灰度級(jí)的出現(xiàn)。
我們可以使用直方圖來了解數(shù)字圖像的像素強(qiáng)度分布,也可以使用直方圖來了解主色。
讓我們繪制一個(gè)直方圖。
from matplotlib import pyplot as plt
histr = cv2.calcHist([image],[0],None,[256],[0,256])
plt.plot(histr)
輸出:

# alternative way to find histogram of an image
plt.hist(image.ravel(),256,[0,256])
plt.show()
輸出:

該圖顯示了圖像上 0 到 255 顏色范圍內(nèi)的像素?cái)?shù)。我們可以看到,所有類型的顏色都有良好的分布。
現(xiàn)在,讓我們將圖像轉(zhuǎn)換為黑白并生成直方圖。
grey_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
histogram = cv2.calcHist([grey_image], [0], None, [256], [0, 256])
plt.plot(histogram, color='k')
輸出:

這個(gè)分布和之前的分布有很大的不同。這主要是因?yàn)閳D像被轉(zhuǎn)換為灰度,然后進(jìn)行分析。
現(xiàn)在,我們執(zhí)行顏色直方圖。
for i, col in enumerate(['b', 'g', 'r']):
hist = cv2.calcHist([image], [i], None, [256], [0, 256])
plt.plot(hist, color = col)
plt.xlim([0, 256])
plt.show()
輸出:

我們可以看到藍(lán)色和綠色的像素?cái)?shù)量遠(yuǎn)高于紅色。這很明顯,因?yàn)閳D像中有很多藍(lán)色和綠色區(qū)域。
所以我們可以看到,繪制圖像直方圖是理解圖像強(qiáng)度分布的好方法。我們看了一些令人興奮的計(jì)算機(jī)視覺應(yīng)用。

原文標(biāo)題 : 使用OpenCV在Python中進(jìn)行圖像操作
發(fā)表評(píng)論
請(qǐng)輸入評(píng)論內(nèi)容...
請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字
圖片新聞
-

落地?zé)o錫!京東首個(gè)物流機(jī)器人超級(jí)工廠來了
-

OpenAI發(fā)布的AI瀏覽器,市場(chǎng)為何反應(yīng)強(qiáng)烈?
-

馬云重返一線督戰(zhàn),阿里重啟創(chuàng)始人模式
-

機(jī)器人奧運(yùn)會(huì)戰(zhàn)報(bào):宇樹機(jī)器人摘下首金,天工Ultra搶走首位“百米飛人”
-

存儲(chǔ)圈掐架!江波龍起訴佰維,索賠121萬
-

長(zhǎng)安汽車母公司突然更名:從“中國(guó)長(zhǎng)安”到“辰致科技”
-

豆包前負(fù)責(zé)人喬木出軌BP后續(xù):均被辭退
-

字節(jié)AI Lab負(fù)責(zé)人李航卸任后返聘,Seed進(jìn)入調(diào)整期
最新活動(dòng)更多
-
6月30日立即申請(qǐng)?jiān)囉?> 【免費(fèi)試用】旭之源工業(yè)電源一一機(jī)器人的穩(wěn)定“心臟“
-
精彩回顧立即查看>> 【限時(shí)免費(fèi)】物理場(chǎng)仿真助力生物醫(yī)學(xué)領(lǐng)域技術(shù)創(chuàng)新
-
精彩回顧立即查看>> 【直播】 智測(cè)未來·2026海克斯康春季產(chǎn)品創(chuàng)新日
-
精彩回顧立即查看>> 【線下論壇】新唐科技×芯唐南京 2026 年度研討會(huì)
-
精彩回顧立即查看>> OFweek 2026(第十五屆)中國(guó)機(jī)器人產(chǎn)業(yè)大會(huì)
-
精彩回顧立即查看>> 維科杯· OFweek 2025中國(guó)機(jī)器人行業(yè)年度評(píng)選
推薦專題
-
2 華為,重大突破!
- 1 人形機(jī)器人“第一股”來了!宇樹科技即將上會(huì)
- 2 全球股市陷AI獨(dú)大結(jié)構(gòu)性瘋狂
- 3 AI狂歡遇上油價(jià)破百,全球股市還能漲多久? | 產(chǎn)聯(lián)看全球
- 4 DeepSeek融資500億,梁文鋒難逃資本局
- 5 谷歌2026 I/O大會(huì)完整回顧:模型依然重要,但智能體正在接管一切
- 6 全球資本,重倉中國(guó)機(jī)器人
- 7 Figure AI 交付突破350臺(tái),陪跑特斯拉會(huì)迎來iPhone 時(shí)刻嗎?
- 8 “國(guó)產(chǎn)GPU第一股”摩爾線程首季扭虧,但造血能力仍待考驗(yàn)
- 9 Anthropic發(fā)布2028年全球AI領(lǐng)導(dǎo)力的兩種情景報(bào)告
- 10 特斯拉宣布監(jiān)督版FSD登陸中國(guó)?
- 高級(jí)軟件工程師 廣東省/深圳市
- 自動(dòng)化高級(jí)工程師 廣東省/深圳市
- 光器件研發(fā)工程師 福建省/福州市
- 銷售總監(jiān)(光器件) 北京市/海淀區(qū)
- 激光器高級(jí)銷售經(jīng)理 上海市/虹口區(qū)
- 光器件物理工程師 北京市/海淀區(qū)
- 激光研發(fā)工程師 北京市/昌平區(qū)
- 技術(shù)專家 廣東省/江門市
- 封裝工程師 北京市/海淀區(qū)
- 結(jié)構(gòu)工程師 廣東省/深圳市


分享





