詳解Python+OpenCV實現圖像二值化
一、圖像二值化
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) #在編譯結果處顯示圖片的信息 這行沒啥用 # 獲取圖像大小 sz1 = sp[0] #長 sz2 = sp[1] #寬 print('width:%d\nheight:%d' % (sz2,sz1)) #控制窗口顯示的比例 # 創建一個窗口顯示圖像 cv2.namedWindow('img') #這行沒啥用 控制顯示圖片窗口的名字 cv2.imshow('img',img) #顯示圖片 # 復制圖像矩陣,生成與源圖像一樣的圖像,並顯示 myimg2 = img.copy(); cv2.namedWindow('myimg2') #這行沒啥用 控制顯示圖片窗口的名字 cv2.imshow('myimg2',myimg2) # 復制並轉換為灰度化圖像並顯示 myimg1 = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #灰度值函數 cv2.namedWindow('myimg1') cv2.imshow('myimg1',myimg1) #顯示灰度處理後的函數 cv2.imwrite('gray.jpg', myimg1) #保存當前灰度值處理過後的文件 cv2.waitKey() #第一個參數是保存文件的名稱,必須加jgp,png等的後綴否則報錯。第二個參數是保存的對象 cv2.destroyAllWindows()
二、圖像二值化(調節閾值)
1.源碼一
代碼如下(示例):
import cv2 def nothing(): # 定義回調函數 pass def image_processing(img, Gauss_flag=1, Color_flag=1, Gray_flag=0): # 圖像預處理 # 高斯濾波器平滑圖像 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) # 將彩色圖像轉為灰度圖像 img = cv2.equalizeHist(img) return img def image_canny(img): # 圖像邊緣檢測 # 設置窗口 cv2.namedWindow('Canny') # 創建滑動條,分別控制各個參數 cv2.createTrackbar('threshold1', 'Canny', 50, 300, nothing) # 閾值1 cv2.createTrackbar('threshold2', 'Canny', 100, 300, nothing) # 較大的閾值2用於檢測圖像中明顯的邊緣 # cv2.createTrackbar('apertureSize', 'Canny', 0, 2, nothing) # Sobel算子大小(3,5,7) cv2.createTrackbar('L2gradient', 'Canny', 0, 1, nothing) # 參數(佈爾值):true:使用更精確的L2范數(兩個方向的倒數的平方和再開放),false:使用L1范數(直接將兩個方向導數的絕對值相加) while (1): # 返回滑動條所在位置的值 threshold1 = cv2.getTrackbarPos('threshold1', 'Canny') # 閾值1 threshold2 = cv2.getTrackbarPos('threshold2', 'Canny') # 閾值2 L2gradient = cv2.getTrackbarPos('L2gradient', 'Canny') # 參數 # 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) # 圖像預處理 img = image_processing(image, Gauss_flag=guass_flag, Color_flag=color_flag, Gray_flag=gray_flag) # 顯示原圖像 cv2.imshow('Original', image) # 顯示預處理後圖像 cv2.imshow('Pretreatment', img) # 圖像邊緣檢測 image_canny(img)
2.源碼二
代碼如下(示例):
import cv2 #載入圖片 img_original=cv2.imread(r'E:\py\python3.7\test2\test14yuzhi\cell.png') #設置窗口 cv2.namedWindow('Canny') #定義回調函數 def nothing(x): pass #創建兩個滑動條,分別控制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()
到此這篇關於詳解Python+OpenCV實現圖像二值化的文章就介紹到這瞭,更多相關Python OpenCV圖像二值化內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- OpenCV中Canny邊緣檢測的實現
- Python實現Opencv cv2.Canny()邊緣檢測
- python中opencv Canny邊緣檢測
- Python OpenCV Canny邊緣檢測算法的原理實現詳解
- Python cv.Canny()方法參數與使用方法