程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

三、opencv-python圖像處理基礎(3)

編輯:Python

目錄

一、圖像的基礎操作

1、獲取並修改圖像中的像素點

2、獲取圖像的屬性

 3、圖像通道的拆分與合並

4、色彩空間的改變

二、圖像的算數操作

1.圖像的加法

2.讀入數據

總結:




一、圖像的基礎操作

1、獲取並修改圖像中的像素點

(1)後邊比較重要的圖像二值化就是基於修改圖像的像素點實現的,我們可以通過行和列的坐標值獲取該像素點的像素值。對於BGR圖像,它返回一個藍,綠,紅值的數組。對於灰度圖像,僅返回相應的強度值。使用相同的方法對像素值進行修改。

(2)代碼示例:

import cv2
import matplotlib.pyplot as plt
img = cv2.imread('123.png')
cv2.putText(img, "I am a pig", (100, 100), cv2.FONT_HERSHEY_SIMPLEX, 2, [0, 0, 255] ,3, cv2.LINE_AA)# 獲取某個像素點的值
px = img[100,100]
# 僅獲取藍色通道的強度值
blue = img[100,100,0]
# 修改某個位置的像素值
img[100,100] = [255,255,255]
cv2.imshow('img',img)
cv2.waitKey(0)

 此代碼這是針對圖像中的一個像素點進行更改,可視化效果不明顯,因此不展示執行效果。

2、獲取圖像的屬性

圖像屬性包括行數,列數和通道數,圖像數據類型,像素數等。

代碼示例:

import cv2
import matplotlib.pyplot as plt
img = cv2.imread('123.png')
cv2.putText(img, "I am a pig", (100, 100), cv2.FONT_HERSHEY_SIMPLEX, 2, [0, 0, 255] ,3, cv2.LINE_AA)# 獲取某個像素點的值
print(img.shape)
print(img.size)
print(img.dtype)
cv2.waitKey(0)

 執行結果:

 3、圖像通道的拆分與合並

有時需要在B,G,R通道圖像上單獨工作。在這種情況下,需要將BGR圖像分割為單個通道。或者在其他情況下,可能需要將這些單獨的通道合並到BGR圖像。你可以通過以下方式完成。

代碼示例:

# 通道拆分
b,g,r = cv.split(img)
# 通道合並
img = cv.merge((b,g,r))

4、色彩空間的改變

OpenCV中有150多種顏色空間轉換方法。最廣泛使用的轉換方法有兩種,BGRGray和BGRHSV。

API:

cv.cvtColor(input_image,flag)

參數:

  • input_image: 進行顏色空間轉換的圖像
  • flag: 轉換類型
    • cv.COLOR_BGR2GRAY : BGRGray
    • cv.COLOR_BGR2HSV: BGR→HSV




二、圖像的算數操作

此部分會在後期圖像處理的目標分割中用到,也是必須要掌握的部分。




1.圖像的加法

你可以使用OpenCV的cv.add()函數把兩幅圖像相加,或者可以簡單地通過numpy操作添加兩個圖像,如res = img1 + img2。兩個圖像應該具有相同的大小和類型,或者第二個圖像可以是標量值。

注意:OpenCV加法和Numpy加法之間存在差異。OpenCV的加法是飽和操作,而Numpy添加是模運算。
參考以下代碼:

>>> x = np.uint8([250])
>>> y = np.uint8([10])
>>> print( cv.add(x,y) ) # 250+10 = 260 => 255
[[255]]
>>> print( x+y ) # 250+10 = 260 % 256 = 4
[4]

這種差別在你對兩幅圖像進行加法時會更加明顯。OpenCV 的結果會更好一點。所以我們盡量使用 OpenCV 中的函數。 

我們將下面兩幅圖像:

 代碼:

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
# 1 讀取圖像
img1 = cv.imread("view.jpg")
img2 = cv.imread("rain.jpg")
# 2 加法操作
img3 = cv.add(img1,img2) # cv中的加法
img4 = img1+img2 # 直接相加
# 3 圖像顯示
fig,axes=plt.subplots(nrows=1,ncols=2,figsize=(10,8),dpi=100)
axes[0].imshow(img3[:,:,::-1])
axes[0].set_title("cv中的加法")
axes[1].imshow(img4[:,:,::-1])
axes[1].set_title("直接相加")
plt.show()

 結果如下所示:



結果驚艷!


2.讀入數據

這其實也是加法,但是不同的是兩幅圖像的權重不同,這就會給人一種混合或者透明的感覺。圖像混合的計算公式如下:

g(x) = (1−α)f0(x) + αf1(x)

通過修改 α 的值(0 → 1),可以實現非常炫酷的混合。

現在我們把兩幅圖混合在一起。第一幅圖的權重是0.7,第二幅圖的權重是0.3。函數cv2.addWeighted()可以按下面的公式對圖片進行混合操作。

dst = α⋅img1 + β⋅img2 + γ

這裡γ取為零。

參考以下代碼:

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
# 1 讀取圖像
img1 = cv.imread("view.jpg")
img2 = cv.imread("rain.jpg")
# 2 圖像混合
img3 = cv.addWeighted(img1,0.7,img2,0.3,0)
# 3 圖像顯示
plt.figure(figsize=(8,8))
plt.imshow(img3[:,:,::-1])
plt.show()

窗口將如下圖顯示:





總結:

前一段講了圖像基本操作的結尾,後一段講了圖像的算數操作,接下來會寫一些有關圖像處理的操作,包括幾何變換、形態學操作、圖像平滑、直方圖、邊緣檢測、模板匹配和霍夫變換等等,想要了解的小伙伴可以繼續跟著思路走^_^.


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved