詳解Python+OpenCV實現(xiàn)圖像二值化
更新時間:2022年05月13日 15:20:02 作者:用余生去守護
圖像二值化就是將圖像上的像素點的灰度值設(shè)置為0或255,也就是將整個圖像呈現(xiàn)出明顯的黑白效果的過程。本文將通過Python+OpenCV實現(xiàn)這一過程,感興趣的可以學(xué)習(xí)一下
一、圖像二值化
1.效果

2.源碼
import cv2
import numpy as np
import matplotlib.pyplot as plt
# img = cv2.imread('test.jpg') #這幾行是對圖像進行降噪處理,但事還存在一些問題。
# dst = cv2.fastNlMeansDenoisingColored(img,None,10,10,7,21)
# plt.subplot(121),plt.imshow(img)
# plt.subplot(122),plt.imshow(dst)
# plt.show()
fn = "cell.png"
if __name__ == '__main__':
print('loading %s' % fn)
img = cv2.imread(fn) #讀取圖像 修改上方 fn的路徑即可
sp = img.shape
print(sp) #在編譯結(jié)果處顯示圖片的信息 這行沒啥用
# 獲取圖像大小
sz1 = sp[0] #長
sz2 = sp[1] #寬
print('width:%d\nheight:%d' % (sz2,sz1)) #控制窗口顯示的比例
# 創(chuàng)建一個窗口顯示圖像
cv2.namedWindow('img') #這行沒啥用 控制顯示圖片窗口的名字
cv2.imshow('img',img) #顯示圖片
# 復(fù)制圖像矩陣,生成與源圖像一樣的圖像,并顯示
myimg2 = img.copy();
cv2.namedWindow('myimg2') #這行沒啥用 控制顯示圖片窗口的名字
cv2.imshow('myimg2',myimg2)
# 復(fù)制并轉(zhuǎn)換為灰度化圖像并顯示
myimg1 = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #灰度值函數(shù)
cv2.namedWindow('myimg1')
cv2.imshow('myimg1',myimg1) #顯示灰度處理后的函數(shù)
cv2.imwrite('gray.jpg', myimg1) #保存當(dāng)前灰度值處理過后的文件
cv2.waitKey() #第一個參數(shù)是保存文件的名稱,必須加jgp,png等的后綴否則報錯。第二個參數(shù)是保存的對象
cv2.destroyAllWindows()
二、圖像二值化(調(diào)節(jié)閾值)
1.源碼一



代碼如下(示例):
import cv2
def nothing(): # 定義回調(diào)函數(shù)
pass
def image_processing(img, Gauss_flag=1, Color_flag=1, Gray_flag=0): # 圖像預(yù)處理
# 高斯濾波器平滑圖像
if Gauss_flag == 1:
img = cv2.GaussianBlur(img, (3, 3), 0)
# 均衡彩色圖像的直方圖
if Color_flag == 1:
img = cv2.cvtColor(img, cv2.COLOR_BGR2YUV)
# 均衡灰度圖像的直方圖
if Gray_flag == 1:
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 將彩色圖像轉(zhuǎn)為灰度圖像
img = cv2.equalizeHist(img)
return img
def image_canny(img): # 圖像邊緣檢測
# 設(shè)置窗口
cv2.namedWindow('Canny')
# 創(chuàng)建滑動條,分別控制各個參數(shù)
cv2.createTrackbar('threshold1', 'Canny', 50, 300, nothing) # 閾值1
cv2.createTrackbar('threshold2', 'Canny', 100, 300, nothing) # 較大的閾值2用于檢測圖像中明顯的邊緣
# cv2.createTrackbar('apertureSize', 'Canny', 0, 2, nothing) # Sobel算子大?。?,5,7)
cv2.createTrackbar('L2gradient', 'Canny', 0, 1,
nothing) # 參數(shù)(布爾值):true:使用更精確的L2范數(shù)(兩個方向的倒數(shù)的平方和再開放),false:使用L1范數(shù)(直接將兩個方向?qū)?shù)的絕對值相加)
while (1):
# 返回滑動條所在位置的值
threshold1 = cv2.getTrackbarPos('threshold1', 'Canny') # 閾值1
threshold2 = cv2.getTrackbarPos('threshold2', 'Canny') # 閾值2
L2gradient = cv2.getTrackbarPos('L2gradient', 'Canny') # 參數(shù)
# aperturesize = cv2.getTrackbarPos('apertureSize', 'Canny') # Sobel算子大小
# size = aperturesize * 2 + 3 # Sobel算子大小(3,5,7)
# Canny邊緣檢測
img_edges = cv2.Canny(img, threshold1, threshold2, L2gradient=L2gradient)
# 顯示邊緣化圖像
cv2.imshow('Canny', img_edges)
if cv2.waitKey(1) == ord('q'): # 按q退出
break
elif cv2.waitKey(1) == ord('s'): # 按s保存圖像到原圖像所在目錄,命名為output.jpg,再退出!
cv2.imwrite('\\'.join(img_path.split('\\')[:-1]) + '\\output.jpg', img_edges)
print("圖像成功保存")
break
cv2.destroyAllWindows()
if __name__ == "__main__":
img_path = input("請輸入圖片地址(如E:\\Code\\xx.jpg):") # 輸入原圖像地址
guass_flag = int(input("是否進行高斯濾波(輸入1進行,輸入0不進行):")) # 輸入1為進行高斯濾波,輸入0為不進行
color_flag = int(input("是否均衡彩色圖像(輸入1進行,輸入0不進行):")) # 輸入1為進行彩色圖像均衡,輸入0為不進行
gray_flag = int(input("是否均衡灰度圖像(輸入1進行,輸入0不進行):")) # 輸入1為進行灰度圖像均衡,輸入0為不進行
# 載入圖像
image = cv2.imread(img_path)
# 圖像預(yù)處理
img = image_processing(image, Gauss_flag=guass_flag, Color_flag=color_flag, Gray_flag=gray_flag)
# 顯示原圖像
cv2.imshow('Original', image)
# 顯示預(yù)處理后圖像
cv2.imshow('Pretreatment', img)
# 圖像邊緣檢測
image_canny(img)2.源碼二
代碼如下(示例):
import cv2
#載入圖片
img_original=cv2.imread(r'E:\py\python3.7\test2\test14yuzhi\cell.png')
#設(shè)置窗口
cv2.namedWindow('Canny')
#定義回調(diào)函數(shù)
def nothing(x):
pass
#創(chuàng)建兩個滑動條,分別控制threshold1,threshold2
cv2.createTrackbar('threshold1','Canny',50,400,nothing)
cv2.createTrackbar('threshold2','Canny',100,400,nothing)
while(1):
#返回滑動條所在位置的值
threshold1=cv2.getTrackbarPos('threshold1','Canny')
threshold2=cv2.getTrackbarPos('threshold2','Canny')
#Canny邊緣檢測
img_edges=cv2.Canny(img_original,threshold1,threshold2)
#顯示圖片
cv2.imshow('original',img_original)
cv2.imshow('Canny',img_edges)
if cv2.waitKey(1)==ord('q'):
break
cv2.destroyAllWindows()到此這篇關(guān)于詳解Python+OpenCV實現(xiàn)圖像二值化的文章就介紹到這了,更多相關(guān)Python OpenCV圖像二值化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
探索Python中zoneinfo模塊處理時區(qū)操作實例
這篇文章主要為大家介紹了探索Python中zoneinfo模塊的用法實例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2024-01-01
YOLOv5車牌識別實戰(zhàn)教程(二)理論基礎(chǔ)
這篇文章主要介紹了YOLOv5車牌識別實戰(zhàn)教程(二)理論基礎(chǔ),在這個教程中,我們將一步步教你如何使用YOLOv5進行車牌識別,幫助你快速掌握YOLOv5車牌識別技能,需要的朋友可以參考下2023-04-04
python-docx修改已存在的Word文檔的表格的字體格式方法
今天小編就為大家分享一篇python-docx修改已存在的Word文檔的表格的字體格式方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-05-05
解決pycharm中opencv-python導(dǎo)入cv2后無法自動補全的問題(不用作任何文件上的修改)
這篇文章主要介紹了解決pycharm中opencv-python導(dǎo)入cv2后無法自動補全的問題(不用作任何文件上的修改),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-03-03

