Python OpenCV 針對圖像細節的不同操作技巧_第1頁
Python OpenCV 針對圖像細節的不同操作技巧_第2頁
Python OpenCV 針對圖像細節的不同操作技巧_第3頁
Python OpenCV 針對圖像細節的不同操作技巧_第4頁
Python OpenCV 針對圖像細節的不同操作技巧_第5頁
已閱讀5頁,還剩3頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第PythonOpenCV針對圖像細節的不同操作技巧本系列專欄寫作將采用首創的問答式寫作形式,快速讓你學習到OpenCV的初級、中級、高級知識。

6.在PythonOpenCV針對圖像細節的不同操作

本篇博客的目標將為你解釋一幅圖像的拆解,包括圖像像素的說明,圖像屬性信息的獲取與修改,

圖像目標區域ROI相關內容,以及圖像通道的知識(包括拆分通道和合并通道)

這些內容在知識結構上與numpy庫十分緊密,如果從學習的角度出發,建議你儲備一下numpy相關知識。

讀取修改圖像的像素值

在之前的博客中,我們已經學到了如何讀取一幅圖像,使用cv2.imread函數即可,并且掌握了該函數的兩個關鍵參數。

讀取圖片之后,我們可以直接使用操作數組的方式獲取圖像任意位置的顏色,一般這個顏色的默認順序是BGR。

測試代碼如下:

importcv2

importmatplotlib.pyplotasplt

src=cv2.imread("./6_test.jpg")

#獲取100x100位置的像素值

print(src[100,100])

cv2.imshow("src",src)

cv2.waitKey()

這里首先獲取100x100位置的像素值。

src[100,100]會獲取到三個值,分別對應的BGR通道的值。我們在圖片上標記一個像素點,rows=250,cols=470,接下來修改上述代碼,看獲取到的BGR值。

importcv2

importmatplotlib.pyplotasplt

src=cv2.imread("./6_test.jpg")

#注意獲取像素值的格式為[cols,rows]

print(src[250,470])

cv2.imshow("src",src)

cv2.waitKey()

上文特別注意的就是,獲取像素值的格式為[cols,rows],列在前,行在后。

以上獲取到的是BGR值,也可以只獲取單個通道的值,對應的代碼是[cols,rows,channel],對應到代碼部分,如下所示:

#獲取藍色通道值

print(src[250,470,0])

藍色通道對應0,綠色通道為1,紅色通道為2,超出以上三個值,就會出現如下錯誤:

IndexError:index3isoutofboundsforaxis2withsize3

當前如果你直接讀取了灰度圖,例如下述代碼,三個通道的值是相同的。

importcv2

importmatplotlib.pyplotasplt

src=cv2.imread("./6_test.jpg",0)

#注意獲取像素值的格式為[cols,rows]

print(src[250,470])

cv2.imshow("src",src)

cv2.waitKey()

這個地方還有一個編碼上存在的潛在問題,如果讀取的是四通道圖片,即圖片有透明度,那數組的索引值可以讀取到3,也就是下述代碼是正確的。

importcv2

importmatplotlib.pyplotasplt

src=cv2.imread("./test.jpg",-1)

#注意獲取像素值的格式為[cols,rows]

print(src[250,470,3])

cv2.imshow("src",src)

cv2.waitKey()

src[250,470,3]成功讀取到了透明通道的值。

我們可以針對特定的像素點進行值的修改,例如下述代碼

importcv2

importmatplotlib.pyplotasplt

src=cv2.imread("./6_test.jpg")

#注意獲取像素值的格式為[cols,rows]

src[250,470]=[255,255,255]

cv2.imshow("src",src)

cv2.waitKey()

注意下圖的紅色箭頭指向的位置,出現一個白色亮點,使用該辦法,可以制造出一個【椒鹽圖片】。

這個地方需要注意的一個潛在BUG,讀取圖片的通道數,決定了你復制時數組元素個數,例如下述代碼將會報錯。

importcv2

importmatplotlib.pyplotasplt

src=cv2.imread("./6_test.jpg")

#注意獲取像素值的格式為[cols,rows]

src[250,470]=[255,255,255,255]

cv2.imshow("src",src)

cv2.waitKey()

錯誤信息都是類似的,提示數組維度不同。

ValueError:cannotcopysequencewithsize4toarrayaxiswithdimension3

最后一點使用以上方式操作圖像的像素點,非常耗時,因為一張圖片的像素點數據是非常大的,一般情況下能用numpy集成好的方法,就不要用這種最笨拙的方式。

使用numpy獲取通道值,注意該方式獲取的是標量,如果你想獲得所有BGR的值,你需要使用array.item()依次獲取。

importcv2

importnumpyasnp

src=cv2.imread("./6_test.jpg")

print(src[100,100])

b=src.item(100,100,0)

g=src.item(100,100,1)

r=src.item(100,100,2)

print(b,g,r)

cv2.imshow("src",src)

cv2.waitKey()

如果希望設置該值,直接使用itemset函數即可。

src.itemset((100,100,0),200)

print(src[100,100])

可以任意尋找一張圖片進行對應的測試,運行效果如下:

[3168118]

3168118

[20068118]

OpenCV中圖像屬性常見問題解析

對于一幅圖像,除了像素矩陣以外,還有一個非常重要的內容,是圖像的屬性,這些包括行、列、通道、數據類型,像素數量、圖像形狀等內容。

例如,我們經常使用img.shape去獲取圖像的形狀,尤其注意的是,返回的內容是行數(rows),列數(cols),以及通道數(channels),并且返回值類型是一個元組。

如果你讀取圖像的時候,設置緊讀取灰度圖,那只會返回行數和列數,相應的通過這個值很容易能判斷出你加載的圖像類型。

例如下述代碼,通過不同的方式讀取同一張圖片,輸出圖像的不同形狀。

importcv2

importnumpyasnp

#選擇一個jpg圖片,可以讀取到不同的通道

src1=cv2.imread("./test.jpg",-1)

src2=cv2.imread("./test.jpg",0)

src3=cv2.imread("./test.jpg")

#四通道,包含透明通道

print(src1.shape)

#灰度圖

print(src2.shape)

#三通道

print(src3.shape)

輸出結果可以快速的讀取出圖像是彩色圖像還是灰度圖像。

(397,595,4)

(397,595)

(397,595,3)

使用img.size可以快速返回圖像中像素的合計數目,測試代碼如下:

#選擇一個jpg圖片,可以讀取到不同的通道

src1=cv2.imread("./test.jpg",-1)

src2=cv2.imread("./test.jpg",0)

src3=cv2.imread("./test.jpg")

#四通道,包含透明通道

print(src1.shape)

print(src1.size)

#灰度圖

print(src2.shape)

print(src2.size)

#三通道

print(src3.shape)

print(src3.size)

我們依舊三種不同的讀取方式,讀取到的像素數分別如下:

(397,595,4)

944860

(397,595)

236215

(397,595,3)

708645

注意,灰度圖像和彩色圖像的像素數不同,它們之前存在如下關系。

灰度圖像的像素數=行數x列數=397x595=236215

彩色圖像的像素數=行數x列數x通道數=944860(四通道)/708645(三通道)

使用img.dtype屬性可以獲取到圖像的類型,具體如下:

print(src1.dty

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論