詳解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中zoneinfo模塊處理時(shí)區(qū)操作實(shí)例
這篇文章主要為大家介紹了探索Python中zoneinfo模塊的用法實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01YOLOv5車(chē)牌識(shí)別實(shí)戰(zhàn)教程(二)理論基礎(chǔ)
這篇文章主要介紹了YOLOv5車(chē)牌識(shí)別實(shí)戰(zhàn)教程(二)理論基礎(chǔ),在這個(gè)教程中,我們將一步步教你如何使用YOLOv5進(jìn)行車(chē)牌識(shí)別,幫助你快速掌握YOLOv5車(chē)牌識(shí)別技能,需要的朋友可以參考下2023-04-04Python爬蟲(chóng)實(shí)例扒取2345天氣預(yù)報(bào)
本篇文章給大家詳細(xì)分析了通過(guò)Python爬蟲(chóng)如何采集到2345的天氣預(yù)報(bào)信息,有興趣的朋友參考學(xué)習(xí)下吧。2018-03-03python-docx修改已存在的Word文檔的表格的字體格式方法
今天小編就為大家分享一篇python-docx修改已存在的Word文檔的表格的字體格式方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-05-05解決pycharm中opencv-python導(dǎo)入cv2后無(wú)法自動(dòng)補(bǔ)全的問(wèn)題(不用作任何文件上的修改)
這篇文章主要介紹了解決pycharm中opencv-python導(dǎo)入cv2后無(wú)法自動(dòng)補(bǔ)全的問(wèn)題(不用作任何文件上的修改),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03