詳解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!

推薦閱讀: