首页
/
每日頭條
/
圖文
/
python 數字圖像處理
python 數字圖像處理
更新时间:2024-09-27 19:24:34

摘要:本篇文章結合灰度三維圖像講解圖像頂帽運算和圖像黑貓運算,通過Python調用OpenCV函數實現。

本篇文章繼續深入,結合灰度三維圖像講解圖像頂帽運算和圖像黑貓運算,通過Python調用OpenCV函數實現。

一.圖像頂帽運算

圖像頂帽運算(top-hat transformation)又稱為圖像禮帽運算,它是用原始圖像減去圖像開運算後的結果,常用于解決由于光照不均勻圖像分割出錯的問題。其公式定義如下:

python 數字圖像處理(跟我學Python圖像處理基于灰度三維圖的圖像頂帽運算和黑帽運算)1

圖像頂帽運算是用一個結構元通過開運算從一幅圖像中删除物體,校正不均勻光照的影響,其效果圖如下圖所示。

python 數字圖像處理(跟我學Python圖像處理基于灰度三維圖的圖像頂帽運算和黑帽運算)2

在Python中,圖像頂帽運算主要調用morphologyEx()實現,其中參數cv2.MORPH_TOPHAT表示頂帽處理,函數原型如下:

dst = cv2.morphologyEx(src, cv2.MORPH_TOPHAT, kernel)

  • src表示原始圖像
  • cv2.MORPH_TOPHAT表示圖像頂帽運算
  • kernel表示卷積核,可以用numpy.ones()函數構建

假設存在一張光照不均勻的米粒圖像,如圖所示,我們需要調用圖像頂帽運算解決光照不均勻的問題。其Python代碼如下所示:

python 數字圖像處理(跟我學Python圖像處理基于灰度三維圖的圖像頂帽運算和黑帽運算)3

#encoding:utf-8 import cv2 import numpy as np #讀取圖片 src = cv2.imread('test06.png', cv2.IMREAD_UNCHANGED) #設置卷積核 kernel = np.ones((10,10), np.uint8) #圖像頂帽運算 result = cv2.morphologyEx(src, cv2.MORPH_TOPHAT, kernel) #顯示圖像 cv2.imshow("src", src) cv2.imshow("result", result) #等待顯示 cv2.waitKey(0) cv2.destroyAllWindows()複制

其運行結果如下,它有效地将米粒與背景分離開來。

python 數字圖像處理(跟我學Python圖像處理基于灰度三維圖的圖像頂帽運算和黑帽運算)4

二.圖像黑帽運算

圖像底帽運算(bottom-hat transformation)又稱為圖像黑帽運算,它是用圖像閉運算操作減去原始圖像後的結果,從而獲取圖像内部的小孔或前景色中黑點,也常用于解決由于光照不均勻圖像分割出錯的問題。其公式定義如下:

python 數字圖像處理(跟我學Python圖像處理基于灰度三維圖的圖像頂帽運算和黑帽運算)5

圖像底帽運算是用一個結構元通過閉運算從一幅圖像中删除物體,常用于校正不均勻光照的影響。其效果圖如下圖所示。

python 數字圖像處理(跟我學Python圖像處理基于灰度三維圖的圖像頂帽運算和黑帽運算)6

在Python中,圖像底帽運算主要調用morphologyEx()實現,其中參數cv2.MORPH_BLACKHAT表示底帽或黑帽處理,函數原型如下:

dst = cv2.morphologyEx(src, cv2.MORPH_BLACKHAT, kernel)

  • src表示原始圖像
  • cv2.MORPH_BLACKHAT表示圖像底帽或黑帽運算
  • kernel表示卷積核,可以用numpy.ones()函數構建

Python實現圖像底帽運算的代碼如下所示:

#encoding:utf-8 import cv2 import numpy as np #讀取圖片 src = cv2.imread('test06.png', cv2.IMREAD_UNCHANGED) #設置卷積核 kernel = np.ones((10, 10), np.uint8) #圖像黑帽運算 result = cv2.morphologyEx(src, cv2.MORPH_BLACKHAT, kernel) #顯示圖像 cv2.imshow("src", src) cv2.imshow("result", result) #等待顯示 cv2.waitKey(0) cv2.destroyAllWindows()複制

其運行結果如圖所示:

python 數字圖像處理(跟我學Python圖像處理基于灰度三維圖的圖像頂帽運算和黑帽運算)7

三.基于灰度三維圖的頂帽黑帽運算

python 數字圖像處理(跟我學Python圖像處理基于灰度三維圖的圖像頂帽運算和黑帽運算)8

為什麼圖像頂帽運算會消除光照不均勻的效果呢?通常可以利用灰度三維圖來進行解釋該算法。灰度三維圖主要調用Axes3D包實現,對原圖繪制灰度三維圖的代碼如下:

# -*- coding: utf-8 -*- import numpy as np import cv2 as cv import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from matplotlib import cm from matplotlib.ticker import LinearLocator, FormatStrFormatter #讀取圖像 img = cv.imread("test06.png") img = cv.cvtColor(img,cv.COLOR_BGR2GRAY) imgd = np.array(img) #image類轉numpy #準備數據 sp = img.shape h = int(sp[0]) #圖像高度(rows) w = int(sp[1]) #圖像寬度(colums) of image #繪圖初始處理 fig = plt.figure(figsize=(16,12)) ax = fig.gca(projection="3d") x = np.arange(0, w, 1) y = np.arange(0, h, 1) x, y = np.meshgrid(x,y) z = imgd surf = ax.plot_surface(x, y, z, cmap=cm.coolwarm) #自定義z軸 ax.set_zlim(-10, 255) ax.zaxis.set_major_locator(LinearLocator(10)) #設置z軸網格線的疏密 #将z的value字符串轉為float并保留2位小數 ax.zaxis.set_major_formatter(FormatStrFormatter('%.02f')) # 設置坐标軸的label和标題 ax.set_xlabel('x', size=15) ax.set_ylabel('y', size=15) ax.set_zlabel('z', size=15) ax.set_title("surface plot", weight='bold', size=20) #添加右側的色卡條 fig.colorbar(surf, shrink=0.6, aspect=8) plt.show()複制

運行結果如下圖所示:

python 數字圖像處理(跟我學Python圖像處理基于灰度三維圖的圖像頂帽運算和黑帽運算)9

從圖像中的像素走勢顯示了該圖受各部分光照不均勻的影響,從而造成背景灰度不均現象,其中凹陷對應圖像中灰度值比較小的區域。而通過圖像白帽運算後的圖像灰度三維圖的代碼如下:

# -*- coding: utf-8 -*- import numpy as np import cv2 as cv import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from matplotlib import cm from matplotlib.ticker import LinearLocator, FormatStrFormatter #讀取圖像 img = cv.imread("test06.png") img = cv.cvtColor(img,cv.COLOR_BGR2GRAY) #圖像黑帽運算 kernel = np.ones((10,10), np.uint8) result = cv.morphologyEx(img, cv.MORPH_BLACKHAT, kernel) #image類轉numpy imgd = np.array(result) #準備數據 sp = result.shape h = int(sp[0]) #圖像高度(rows) w = int(sp[1]) #圖像寬度(colums) of image #繪圖初始處理 fig = plt.figure(figsize=(8,6)) ax = fig.gca(projection="3d") x = np.arange(0, w, 1) y = np.arange(0, h, 1) x, y = np.meshgrid(x,y) z = imgd surf = ax.plot_surface(x, y, z, cmap=cm.coolwarm) #自定義z軸 ax.set_zlim(-10, 255) ax.zaxis.set_major_locator(LinearLocator(10)) #設置z軸網格線的疏密 #将z的value字符串轉為float并保留2位小數 ax.zaxis.set_major_formatter(FormatStrFormatter('%.02f')) # 設置坐标軸的label和标題 ax.set_xlabel('x', size=15) ax.set_ylabel('y', size=15) ax.set_zlabel('z', size=15) ax.set_title("surface plot", weight='bold', size=20) #添加右側的色卡條 fig.colorbar(surf, shrink=0.6, aspect=8) plt.show()複制

效果圖如下所示,對應的灰度更集中于10至100區間,由此證明了不均勻的背景被大緻消除了,有利于後續的阈值分割或圖像分割。

python 數字圖像處理(跟我學Python圖像處理基于灰度三維圖的圖像頂帽運算和黑帽運算)10

點擊關注,第一時間了解華為雲新鮮技術~

,
Comments
Welcome to tft每日頭條 comments! Please keep conversations courteous and on-topic. To fosterproductive and respectful conversations, you may see comments from our Community Managers.
Sign up to post
Sort by
Show More Comments
推荐阅读
龍嶺迷窟李春來男扮女裝(龍嶺迷窟李春來土掉渣)
龍嶺迷窟李春來男扮女裝(龍嶺迷窟李春來土掉渣)
  《龍嶺迷窟》中,李春來這個角色真是太有欺騙性了。   開篇中,李春來給大家的第一印象就是膽小、老實和土氣。      懷裡揣着個破包,又想拿繡鞋賣錢娶媳婦,又怕大城市裡壞人多,搶了自己的寶貝。   這份患得患失,想貪便宜又怕出事的心理在李春來身上表現得淋漓盡緻。   無論是與胖子的初次見面,還是後來一起吃羊肉火鍋,李春來都充分展示了山村農民的老實與淳樸,...
2024-09-27
neighbor加不加s(每日積累背三句)
neighbor加不加s(每日積累背三句)
  “每日背三句”可以幫助大家提高:   1. 在相對短時間内提升語感,語感對口語是非常重要的。   2. 語感的提高幫助我們提高口語中的語法。不經思考,張嘴就說對。   3. 積累觀點,使用到日常交流讨論中,也可以使用到雅思或托福口語考試中。   4. 提升發音(單個單詞發音、連讀失去爆破、重讀弱讀略讀)。   5. 發音提高會帶來聽力的提高。很多同學聽不...
2024-09-27
全新寶詩龍(一組圖告訴你為什麼Quatre系列隻賣了十三年就成了寶詩龍的經典)
全新寶詩龍(一組圖告訴你為什麼Quatre系列隻賣了十三年就成了寶詩龍的經典)
  一般能成為珠寶品牌的經典珠寶,幾乎都經過了百年曆史的沉澱。而Boucheron寶石龍Quatre系列從發布至今才經曆了13年卻成了品牌标志性作品,這個系列珠寶到底有着什麼樣的魔力?今天就一同跟随珠寶之家的攝像頭探索一下吧。      Boucheron 寶詩龍 Quatre Classique系列   作為芳登廣場首家珠寶商,1893年弗雷德裡克·寶詩龍...
2024-09-27
營口十一活動(國慶舉杯慶團圓)
營口十一活動(國慶舉杯慶團圓)
  來源:營口文旅集團  “國慶舉杯慶團圓,中秋濃情在老街”文藝演出預告         國慶中秋雙節将至,為了遊客來營口遼河老街感受本土文化氛圍和節日氣氛,我們安排了豐富的民俗活動和精彩的文藝演出。國慶舉杯慶團圓,中秋濃情在老街。   主辦單位:營口文化旅遊産業集團   承辦單位: 營口藝術劇院   演出時間:2020年10月1日 星期四 晚6:30   ...
2024-09-27
金庸最武俠的打開方式(還原真實金庸我不武俠)
金庸最武俠的打開方式(還原真實金庸我不武俠)
  那些陪伴我們青春的朋友,正在一個一個離我們而去。據香港媒體報導,10月30日,筆名為“金庸”的武俠小說泰鬥查良镛逝世,享年94歲。      金庸(1924年3月10日-2018年10月30日)   金庸(1924年3月10日-2018年10月30日),原名查良镛,生于浙江省海甯市,1948年移居香港 ,當代武俠小說作家、新聞學家、企業家、政治評論家、社...
2024-09-27
Copyright 2023-2024 - www.tftnews.com All Rights Reserved