詳解Python+OpenCV實(shí)現(xiàn)圖像二值化
一、圖像二值化
1.效果

2.源碼
import cv2
import numpy as np
import matplotlib.pyplot as plt
# img = cv2.imread('test.jpg') #這幾行是對(duì)圖像進(jìn)行降噪處理,但事還存在一些問(wèn)題。
# 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é)果處顯示圖片的信息 這行沒(méi)啥用
# 獲取圖像大小
sz1 = sp[0] #長(zhǎng)
sz2 = sp[1] #寬
print('width:%d\nheight:%d' % (sz2,sz1)) #控制窗口顯示的比例
# 創(chuàng)建一個(gè)窗口顯示圖像
cv2.namedWindow('img') #這行沒(méi)啥用 控制顯示圖片窗口的名字
cv2.imshow('img',img) #顯示圖片
# 復(fù)制圖像矩陣,生成與源圖像一樣的圖像,并顯示
myimg2 = img.copy();
cv2.namedWindow('myimg2') #這行沒(méi)啥用 控制顯示圖片窗口的名字
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)前灰度值處理過(guò)后的文件
cv2.waitKey() #第一個(gè)參數(shù)是保存文件的名稱(chēng),必須加jgp,png等的后綴否則報(bào)錯(cuò)。第二個(gè)參數(shù)是保存的對(duì)象
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): # 圖像邊緣檢測(cè)
# 設(shè)置窗口
cv2.namedWindow('Canny')
# 創(chuàng)建滑動(dòng)條,分別控制各個(gè)參數(shù)
cv2.createTrackbar('threshold1', 'Canny', 50, 300, nothing) # 閾值1
cv2.createTrackbar('threshold2', 'Canny', 100, 300, nothing) # 較大的閾值2用于檢測(cè)圖像中明顯的邊緣
# cv2.createTrackbar('apertureSize', 'Canny', 0, 2, nothing) # Sobel算子大?。?,5,7)
cv2.createTrackbar('L2gradient', 'Canny', 0, 1,
nothing) # 參數(shù)(布爾值):true:使用更精確的L2范數(shù)(兩個(gè)方向的倒數(shù)的平方和再開(kāi)放),false:使用L1范數(shù)(直接將兩個(gè)方向?qū)?shù)的絕對(duì)值相加)
while (1):
# 返回滑動(dòng)條所在位置的值
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算子大?。?,5,7)
# Canny邊緣檢測(cè)
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("請(qǐng)輸入圖片地址(如E:\\Code\\xx.jpg):") # 輸入原圖像地址
guass_flag = int(input("是否進(jìn)行高斯濾波(輸入1進(jìn)行,輸入0不進(jìn)行):")) # 輸入1為進(jìn)行高斯濾波,輸入0為不進(jìn)行
color_flag = int(input("是否均衡彩色圖像(輸入1進(jìn)行,輸入0不進(jìn)行):")) # 輸入1為進(jìn)行彩色圖像均衡,輸入0為不進(jìn)行
gray_flag = int(input("是否均衡灰度圖像(輸入1進(jìn)行,輸入0不進(jìn)行):")) # 輸入1為進(jìn)行灰度圖像均衡,輸入0為不進(jìn)行
# 載入圖像
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)
# 圖像邊緣檢測(cè)
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)建兩個(gè)滑動(dòng)條,分別控制threshold1,threshold2
cv2.createTrackbar('threshold1','Canny',50,400,nothing)
cv2.createTrackbar('threshold2','Canny',100,400,nothing)
while(1):
#返回滑動(dòng)條所在位置的值
threshold1=cv2.getTrackbarPos('threshold1','Canny')
threshold2=cv2.getTrackbarPos('threshold2','Canny')
#Canny邊緣檢測(cè)
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實(shí)現(xiàn)圖像二值化的文章就介紹到這了,更多相關(guān)Python OpenCV圖像二值化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python基礎(chǔ)常用內(nèi)建函數(shù)圖文示例解析
這篇文章主要為大家Python常用內(nèi)建函數(shù),文中通過(guò)圖例詳細(xì)的給大家作出了講解分析,有需要的朋友可以借鑒參考下,希望可以有所幫助2021-09-09
幾行代碼讓 Python 函數(shù)執(zhí)行快 30 倍
Python 編程語(yǔ)言,與其他流行編程語(yǔ)言相比主要缺點(diǎn)是它的動(dòng)態(tài)特性和多功能屬性拖慢了速度表現(xiàn)。Python 代碼是在運(yùn)行時(shí)被解釋的,而不是在編譯時(shí)被編譯為原生代碼。在本文中,我們將討論如何用多處理模塊并行執(zhí)行自定義 Python 函數(shù),并進(jìn)一步對(duì)比運(yùn)行時(shí)間指標(biāo)。2021-10-10
Python HTMLTestRunner可視化報(bào)告實(shí)現(xiàn)過(guò)程解析
這篇文章主要介紹了Python HTMLTestRunner可視化報(bào)告實(shí)現(xiàn)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04
使用matplotlib的pyplot模塊繪圖的實(shí)現(xiàn)示例
這篇文章主要介紹了使用matplotlib的pyplot模塊繪圖的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
跟老齊學(xué)Python之從格式化表達(dá)式到方法
上一講,主要介紹了用%表達(dá)的一種輸出格式化表達(dá)式。在那一講最后又拓展了一點(diǎn)東西,拓展的那點(diǎn),名曰:格式化方法。因?yàn)樗R(shí)上是使用了str的format方法。2014-09-09
python 實(shí)現(xiàn)在txt指定行追加文本的方法
下面小編就為大家分享一篇python 實(shí)現(xiàn)在txt指定行追加文本的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-04-04

