首頁 > 軟體

詳解Python+OpenCV實現影象二值化

2022-05-13 21:48:30

一、影象二值化

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:%dnheight:%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:pypython3.7test2test14yuzhicell.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影象二值化內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com