日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

opencv入门课程:彩色图像灰度化和二值化(采用skimage库和opencv库两种方法)

發布時間:2023/11/29 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 opencv入门课程:彩色图像灰度化和二值化(采用skimage库和opencv库两种方法) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

用最簡單的辦法實現彩色圖像灰度化和二值化:

首先采用skimage庫(skimage庫現在在scikit_image庫中)實現:

from skimage.color import rgb2gray import numpy as np import matplotlib.pyplot as plt""" skimage庫實現彩色圖像的灰度化、二值化 """#輸入原圖像 plt.subplot(221) #使用plt.subplot來創建小圖. plt.subplot(221)表示將整個圖像窗口分為2行2列, 當前位置為1. img = plt.imread("lenna.png") #圖像輸入 plt.imshow(img) #圖像輸出 print("---image lenna----") print(img)# 灰度化 img_gray = rgb2gray(img) plt.subplot(222) plt.imshow(img_gray, cmap='gray') print("---image gray----") print(img_gray)#二值化 img_binary = np.where(img_gray >= 0.5, 1, 0) #像素值大于0.5為1,小于0.5為0 print("-----imge_binary------") print(img_binary) print(img_binary.shape) #輸出圖像分辨率 plt.subplot(223) plt.imshow(img_binary, cmap='gray') plt.show()

運行結果:

采用opencv庫(cv2)實現:

import matplotlib.pyplot as plt import cv2""" cv2實現彩色圖像的灰度化、二值化 這里采用plt輸出,如果需要cv2輸出,只需要將plt的輸出注釋掉,將cv2的輸出取消注釋 """#輸入原圖像 plt.subplot(221) img = cv2.imread("lenna.png", 1) #1是彩色輸入,0是灰色輸入 #cv2.imshow('img',img)#通道轉換 b, g, r = cv2.split(img) img = cv2.merge([r, g, b])plt.imshow(img)#灰度化 img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) img_gray1 = img_gray plt.subplot(222) #cv2.imshow('img2',img_gray) plt.imshow(img_gray,cmap='gray')#二值化 cv2.threshold(img_gray1,127,255,0,img_gray1) #像素值大于127為255(白色),小于為0(黑色) plt.subplot(223) plt.imshow(img_gray1,cmap='gray') plt.show()# cv2.imshow('img3',img_gray1) # cv2.waitKey(0)

需要注意的問題:

注意一:
在plt讀取圖像之后,圖像的每一個像素值都在[0,1]之間,在之后的cv2讀取的圖像,每一個像素值在[0,255]之間,所以在二值化時,plt是閾值為0.5,像素值分成0或1,而cv2中閾值是127,像素值分為0或255。

注意二
無論誰cv輸出還是plt輸出的最后的結尾都需要加上cv.waitkey(0)或者plt.show()不然輸出圖像轉瞬即逝,很快就消失了,不能長時間停留。

注意三:
這里采用plt或者cv兩種輸出方式!但是注意,當cv輸入plt輸出的時候會發現圖像色彩失真!

因為 opencv 的接口使用BGR模式,而 matplotlib.pyplot 接口使用的是RGB模式
解決方法是:
在cv輸入圖像后把通道順序變換一下,就在cv2.imread輸入后面添加

b, g, r = cv2.split(img) img = cv2.merge([r, g, b])

添加后運行結果:

注意四:
在灰度化和二值化圖像用plt輸出的時候必須添加cmap = 'gray',如果不添加得不到想要的圖像。
至于原因,我在網上得到最好的解釋是:

當img1具有形狀(M,N,3)或(M,N,4)時,img1中的值將被解釋為RGB或RGBA值。在這種情況下,cmap將被忽略。每the help(plt.imshow) docstring:

cmap:~matplotlib.colors.Colormap,可選,默認:無

如果為None,則默認為rc image.cmap值。 cmap會被忽略 X有RGB(A)信息

但是,如果img是形狀(M,N)的數組,則cmap會控制用于顯示值的色彩映射。

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的opencv入门课程:彩色图像灰度化和二值化(采用skimage库和opencv库两种方法)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。