99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁大數(shù)據(jù)時代使用OpenCV實現(xiàn)圖像增強
使用OpenCV實現(xiàn)圖像增強
2020-08-06
收藏

小編今天給大家分享的文章又是關(guān)于OpenCV的。OpenCV是目前最有名的一款計算機視覺軟件庫了,將OpenCV吃透對于我們計算機視覺以及機器學(xué)習(xí)甚至是AI人工智能方面都有很大幫助。下面,就跟小編一起來看如何使用OpenCV實現(xiàn)圖像增強吧。

以下文章來源: 小白學(xué)視覺

作者:努比

本期將介紹如何通過圖像處理從低分辨率/模糊/低對比度的圖像中提取有用信息。

下面讓我們一起來探究這個過程:

首先我們獲取了一個LPG氣瓶圖像,該圖像取自在傳送帶上運行的倉庫。我們的目標(biāo)是找出LPG氣瓶的批號,以便更新已檢測的LPG氣瓶數(shù)量。

步驟1:導(dǎo)入必要的庫

import cv2
import numpy as np
import matplotlib.pyplot as plt

步驟2:加載圖像并顯示示例圖像。

img= cv2.imread('cylinder1.png')
img1=cv2.imread('cylinder.png')
images=np.concatenate(img(img,img1),axis=1)
cv2.imshow("Images",images)
cv2.waitKey(0)
cv2.destroyAllWindows()

LPG氣瓶圖片(a)批次-D26(b)批次C27

該圖像的對比度非常差。我們幾乎看不到批號。這是在燈光條件不足的倉庫中的常見問題。接下來我們將討論對比度受限的自適應(yīng)直方圖均衡化,并嘗試對數(shù)據(jù)集使用不同的算法進(jìn)行實驗。

步驟3:將圖像轉(zhuǎn)換為灰度圖像

gray_img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
gray_img1=cv2.cvtColor(img1,cv2.COLOR_BGR2GRAY)

步驟4:找到灰度圖像的直方圖后,尋找強度的分布。


hist=cv2.calcHist(gray_img,[0],None,[256],[0,256])hist1=cv2.calcHist(gray_img1,[0],None,[256],[0,256])plt.subplot(121)plt.title("Image1")plt.xlabel('bins')plt.ylabel("No of pixels")plt.plot(hist)plt.subplot(122)plt.title("Image2")plt.xlabel('bins')plt.ylabel("No of pixels")plt.plot(hist1)plt.show()

步驟5:現(xiàn)在,使用cv2.equalizeHist()函數(shù)來均衡給定灰度圖像的對比度。cv2.equalizeHist()函數(shù)可標(biāo)準(zhǔn)化亮度并增加對比度。


gray_img_eqhist=cv2.equalizeHist(gray_img)gray_img1_eqhist=cv2.equalizeHist(gray_img1)hist=cv2.calcHist(gray_img_eqhist,[0],None,[256],[0,256])hist1=cv2.calcHist(gray_img1_eqhist,[0],None,[256],[0,256])plt.subplot(121)plt.plot(hist)plt.subplot(122)plt.plot(hist1)plt.show()

步驟6:顯示灰度直方圖均衡圖像

eqhist_images=np.concatenate((gray_img_eqhist,gray_img1_eqhist),axis=1)
cv2.imshow("Images",eqhist_images)
cv2.waitKey(0)
cv2.destroyAllWindows()

灰度直方圖均衡

讓我們進(jìn)一步深入了解CLAHE

步驟7:

對比度有限的自適應(yīng)直方圖均衡

該算法可以用于改善圖像的對比度。該算法通過創(chuàng)建圖像的多個直方圖來工作,并使用所有這些直方圖重新分配圖像的亮度。CLAHE可以應(yīng)用于灰度圖像和彩色圖像。有2個參數(shù)需要調(diào)整。

1. 限幅設(shè)置了對比度限制的閾值。默認(rèn)值為40

2. tileGridsize設(shè)置行和列中標(biāo)題的數(shù)量。在應(yīng)用CLAHE時,為了執(zhí)行計算,圖像被分為稱為圖塊(8 * 8)的小塊。

clahe=cv2.createCLAHE(clipLimit=40)
gray_img_clahe=clahe.apply(gray_img_eqhist)
gray_img1_clahe=clahe.apply(gray_img1_eqhist)
images=np.concatenate((gray_img_clahe,gray_img1_clahe),axis=1)
cv2.imshow("Images",images)
cv2.waitKey(0)
cv2.destroyAllWindows()

步驟8:

門檻技術(shù)

閾值處理是一種將圖像劃分為前景和背景的簡單但有效的方法。如果像素強度小于某個預(yù)定義常數(shù)(閾值),則最簡單的閾值化方法將源圖像中的每個像素替換為黑色像素;如果像素強度大于閾值,則使用白色像素替換源像素。閾值的不同類型是:

cv2.THRESH_BINARY

cv2.THRESH_BINARY_INV

cv2.THRESH_TRUNC

cv2.THRESH_TOZERO

cv2.THRESH_TOZERO_INV

cv2.THRESH_OTSU

cv2.THRESH_TRIANGLE

嘗試更改閾值和max_val以獲得不同的結(jié)果。

th=80
max_val=255
ret, o1 = cv2.threshold(gray_img_clahe, th, max_val, cv2.THRESH_BINARY)
cv2.putText(o1,"Thresh_Binary",(40,100),cv2.FONT_HERSHEY_SIMPLEX,2,(255,255,255),3,cv2.LINE_AA)
ret, o2 = cv2.threshold(gray_img_clahe, th, max_val, cv2.THRESH_BINARY_INV)
cv2.putText(o2,"Thresh_Binary_inv",(40,100),cv2.FONT_HERSHEY_SIMPLEX,2,(255,255,255),3,cv2.LINE_AA)
ret, o3 = cv2.threshold(gray_img_clahe, th, max_val, cv2.THRESH_TOZERO)
cv2.putText(o3,"Thresh_Tozero",(40,100),cv2.FONT_HERSHEY_SIMPLEX,2,(255,255,255),3,cv2.LINE_AA)
ret, o4 = cv2.threshold(gray_img_clahe, th, max_val, cv2.THRESH_TOZERO_INV)
cv2.putText(o4,"Thresh_Tozero_inv",(40,100),cv2.FONT_HERSHEY_SIMPLEX,2,(255,255,255),3,cv2.LINE_AA)
ret, o5 = cv2.threshold(gray_img_clahe, th, max_val, cv2.THRESH_TRUNC)
cv2.putText(o5,"Thresh_trunc",(40,100),cv2.FONT_HERSHEY_SIMPLEX,2,(255,255,255),3,cv2.LINE_AA)
ret ,o6=  cv2.threshold(gray_img_clahe, th, max_val,  cv2.THRESH_OTSU)
cv2.putText(o6,"Thresh_OSTU",(40,100),cv2.FONT_HERSHEY_SIMPLEX,2,(255,255,255),3,cv2.LINE_AA)

final=np.concatenate((o1,o2,o3),axis=1)
final1=np.concatenate((o4,o5,o6),axis=1)

cv2.imwrite("Image1.jpg",final)
cv2.imwrite("Image2.jpg",final1)

Thresh_Binary_inv,Thresh_Binary_inv,Thresh_Tozero

Thresh_Tozero_inv,Thresh_trunc,Thresh_OSTU

步驟9:自適應(yīng)閾值

在上一節(jié)中,我們使用了全局閾值來應(yīng)用cv2.threshold()。如我們所見,由于圖像不同區(qū)域的照明條件不同,因此獲得的結(jié)果不是很好。在這些情況下,您可以嘗試自適應(yīng)閾值化。在OpenCV中,自適應(yīng)閾值處理由cv2.adapativeThreshold()函數(shù)執(zhí)行

此功能將自適應(yīng)閾值應(yīng)用于src陣列(8位單通道圖像)。maxValue參數(shù)設(shè)置dst圖像中滿足條件的像素的值。adaptiveMethod參數(shù)設(shè)置要使用的自適應(yīng)閾值算法。

cv2.ADAPTIVE_THRESH_MEAN_C:將T(x,y)閾值計算為(x,y)的blockSize x blockSize鄰域的平均值減去C參數(shù)。
cv2.ADAPTIVE_THRESH_GAUSSIAN_C:將T(x,y)閾值計算為(x,y)的blockSize x blockSize鄰域的加權(quán)總和減去C參數(shù)。

blockSize參數(shù)設(shè)置用于計算像素閾值的鄰域的大小,它可以取值3、5、7等。

C參數(shù)只是從均值或加權(quán)均值中減去的常數(shù)(取決于adaptiveMethod參數(shù)設(shè)置的自適應(yīng)方法)。通常,此值為正,但可以為零或負(fù)。

gray_image = cv2.imread('cylinder1.png',0)
gray_image1 = cv2.imread('cylinder.png',0)
thresh1 = cv2.adaptiveThreshold(gray_image, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2)
thresh2 = cv2.adaptiveThreshold(gray_image, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 31, 3)
thresh3 = cv2.adaptiveThreshold(gray_image, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 13, 5)
thresh4 = cv2.adaptiveThreshold(gray_image, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 31, 4)
thresh11 = cv2.adaptiveThreshold(gray_image1, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2)
thresh21 = cv2.adaptiveThreshold(gray_image1, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 31, 5)
thresh31 = cv2.adaptiveThreshold(gray_image1, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 21,5 )
thresh41 = cv2.adaptiveThreshold(gray_image1, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 31, 5)

final=np.concatenate((thresh1,thresh2,thresh3,thresh4),axis=1)
final1=np.concatenate((thresh11,thresh21,thresh31,thresh41),axis=1)
cv2.imwrite('rect.jpg',final)
cv2.imwrite('rect1.jpg',final1)

自適應(yīng)閾值

自適應(yīng)閾值

步驟10:OTSU二值化

Otsu的二值化算法,在處理雙峰圖像時是一種很好的方法。雙峰圖像可以通過其包含兩個峰的直方圖來表征。Otsu的算法通過最大化兩類像素之間的方差來自動計算將兩個峰分開的最佳閾值。等效地,最佳閾值使組內(nèi)差異最小化。Otsu的二值化算法是一種統(tǒng)計方法,因為它依賴于從直方圖得出的統(tǒng)計信息(例如,均值,方差或熵)

gray_image = cv2.imread('cylinder1.png',0)
gray_image1 = cv2.imread('cylinder.png',0)
ret,thresh1 = cv2.threshold(gray_image,0, 255,  cv2.THRESH_BINARY+cv2.THRESH_OTSU)
ret,thresh2 = cv2.threshold(gray_image1,0, 255,  cv2.THRESH_BINARY+cv2.THRESH_OTSU)

cv2.imwrite('rect.jpeg',np.concatenate((thresh1,thresh2),axis=1))

OTSU二值化

現(xiàn)在,我們已經(jīng)從低對比度的圖像中清楚地識別出批號。

數(shù)據(jù)分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個參數(shù)驗證碼對象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗服務(wù)器是否宕機 new_captcha: data.new_captcha, // 用于宕機時表示是新驗證碼的宕機 product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計時完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }