深度學習中使用OpenCV進行圖像處理

OpenCV 圖像處理 動畫 深度學習 小熊大學AI 2019-06-07

一、圖像的基礎

1、像素

這是數字圖像中的最小的單元,像素是圖像的子採樣形式。合併像素以提供完整的圖像。

2、圖像分辨率

這是圖像中出現的像素數。圖像包含行和列中的像素,例如640 * 480表示我們有640像素列和480像素行。通過將行中的像素乘以列中的像素來計算像素的總數。

3、測量圖像分辨率的單位

有兩個用於測量圖像分辨率的基本單位

  • 每英 寸像素數(PPI)
  • 每英寸點數(DPI)

4、位圖圖像

通過將像素值(整數)轉換為字節得到的。它們用0和1表示。

5、圖像壓縮

  • 無損壓縮
  • 有損壓縮

6、無損壓縮

這隻會減小圖像的大小而不會降低質量。

深度學習中使用OpenCV進行圖像處理

無損壓縮過程

7、有損壓縮

有損壓縮會使質量有一定的損失,它優先考慮節省空間而不是質量。

深度學習中使用OpenCV進行圖像處理

有損壓縮過程

8、圖像文件格式

JPEG:聯合圖像專家組,有損壓縮,照片和繪畫。

TIFF:標記的圖像文件格式,無損壓縮,文檔存儲、遊戲和動畫。

GIF:位圖圖像格式,無損壓縮,遊戲和動畫

BMP:位圖,獨立於顯示設備,在windows中缺乏壓縮

PNG:便攜式網絡圖形,無損壓縮,通過互聯網傳輸圖像。

WebP(由谷歌開發的格式)有損和無損壓縮,程序中的消息圖片。

SVG:可縮放的向量圖形,用於交互和動畫,應用也Web開發

二、顏色空間

深度學習中使用OpenCV進行圖像處理

1.RGB顏色模型 2.HSL顏色模型 3.HSV顏色模型

1、顏色模型

顏色模型RGB是最常用的圖像數據,也是非常古老的顏色編碼。後來HSV(色調飽和度明度)和HSL(色調飽和度亮度)被開發出來,並且發現它與人類感知顏色的方式更緊密地對齊。

RGB - 所有三個顏色的值均為0到255,特定顏色由RG和B的組合定義。

HSL和HSV - 模型的顏色是我們正在尋找的色調,飽和度是我們有多少色調,亮度代表它的明暗度。

  • RGB(紅色,綠色,藍色)
  • XYZ(閾值超出飽和度)
  • HSL / HSV(色調,飽和度,明暗度)
  • LAB(明亮度, 從洋紅色至綠色的範圍 , 從黃色至藍色的範圍 )
  • LCH(明亮度,飽和度,色相)
  • YUV(明亮度,色度,飽和度)
  • YPbPr( 色差分量接口 )

2、在Opencv中讀取和更改顏色空間

Opencv以BGR格式讀取圖像

import cv2
import matplotlib.pyplot as plt
img = cv2.imread('puppy.jpg')
plt.imshow(img)
深度學習中使用OpenCV進行圖像處理

深度學習中使用OpenCV進行圖像處理

BGR圖像

img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img)
深度學習中使用OpenCV進行圖像處理

深度學習中使用OpenCV進行圖像處理

RGB圖像

img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
plt.imshow(img)
深度學習中使用OpenCV進行圖像處理

深度學習中使用OpenCV進行圖像處理

HSV圖像

img = cv2.cvtColor(img, cv2.COLOR_BGR2HLS)
plt.imshow(img)
深度學習中使用OpenCV進行圖像處理

深度學習中使用OpenCV進行圖像處理

HLS圖像

3、使用Opencv混合2張圖像

(1)混合兩個大小相同的圖像

img1 = cv2.imread('../DATA/dog_backpack.png')
img2 = cv2.imread('../DATA/watermark_no_copy.png')
img1 = cv2.cvtColor(img1, cv2.COLOR_BGR2RGB)
img2 = cv2.cvtColor(img2, cv2.COLOR_BGR2RGB)
img1 =cv2.resize(img1,(1200,1200))
img2 =cv2.resize(img2,(1200,1200))
plt.imshow(img1)
plt.imshow(img2)
深度學習中使用OpenCV進行圖像處理

深度學習中使用OpenCV進行圖像處理

圖像1和圖像2

blended = cv2.addWeighted(src1=img1,alpha=0.7,src2=img2,beta=0.3,gamma=0)
plt.imshow(blended)
深度學習中使用OpenCV進行圖像處理

調整alpha,beta和gamma值!

深度學習中使用OpenCV進行圖像處理

(2)混合兩個不同大小的圖像

img1 = cv2.imread('../DATA/dog_backpack.png')
img2 = cv2.imread('../DATA/watermark_no_copy.png')
img2 =cv2.resize(img2,(600,600))
img1 = cv2.cvtColor(img1, cv2.COLOR_BGR2RGB)
img2 = cv2.cvtColor(img2, cv2.COLOR_BGR2RGB)
深度學習中使用OpenCV進行圖像處理

圖像1的形狀為(1401,934,3),圖像2的形狀為(600,600,3)

為了混合不同尺寸的圖像,你需要確定ROI(感興趣區域),並且圖像需要蒙版圖像(黑色背景)

x_offset=934-600
y_offset=1401-600
# Creating an ROI of the same size of the foreground image (smaller image that will go on top)
rows,cols,channels = img2.shape
# roi = img1[0:rows, 0:cols ] # TOP LEFT CORNER
roi = img1[y_offset:1401,x_offset:943] # BOTTOM RIGHT CORNER
# Now create a mask of logo and create its inverse mask also
img2gray = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)
mask_inv = cv2.bitwise_not(img2gray)
#this creates the image as B&W with black as background
plt.imshow(mask_inv,cmap='gray')
深度學習中使用OpenCV進行圖像處理

深度學習中使用OpenCV進行圖像處理

## Create the mask as 3 dimensional (RGB)
white_background = np.full(img2.shape, 255, dtype=np.uint8)
bk = cv2.bitwise_or(white_background, white_background, mask=mask_inv)
fg = cv2.bitwise_or(img2, img2, mask=mask_inv)
## put the original on the mask image to blend
final_roi = cv2.bitwise_or(roi,fg)
large_img = img1
small_img = final_roi
large_img[y_offset:y_offset+small_img.shape[0], x_offset:x_offset+small_img.shape[1]] = small_img
plt.imshow(large_img)
深度學習中使用OpenCV進行圖像處理

深度學習中使用OpenCV進行圖像處理

4、自適應閾值

Opencv在cv2.threshold中提供了各種閾值

讓我們使用實時自適應閾值處理

img = cv2.imread("../DATA/crossword.jpg",0)
plt.imshow(img,cmap='gray')
深度學習中使用OpenCV進行圖像處理

深度學習中使用OpenCV進行圖像處理

原始圖像

th1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
th2 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,11,8)
plt.imshow(th1)
plt.imshow(th2)
深度學習中使用OpenCV進行圖像處理

深度學習中使用OpenCV進行圖像處理

圖像1和圖像2

th3 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY,15,8)
blended = cv2.addWeighted(src1=th1,alpha=0.7,src2=th2,beta=0.3,gamma=0)
show_pic(blended)
plt.imshow(blended)
深度學習中使用OpenCV進行圖像處理

深度學習中使用OpenCV進行圖像處理

最終的自適應閾值圖像

5、模糊和去噪

(1)Gamma校正 - Gamma校正可用於調整圖像的亮度

img = cv2.imread('../DATA/bricks.jpg').astype(np.float32) / 255
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img)
gamma = 1/4
effected_image = np.power(img, gamma)
plt.imshow(effected_image)
gamma = 2
effected_image = np.power(img, gamma)
plt.imshow(effected_image)
深度學習中使用OpenCV進行圖像處理

深度學習中使用OpenCV進行圖像處理

1.原始圖像 2.Gamma校正(1/4)3.Gamma校正(2)

(2)高斯模糊 - 高斯模糊就是高斯核與原始圖像的卷積。高斯核的大小可以根據圖像的大小取奇數值。

讓我們為圖像添加文本,以便有效地可視化高斯模糊

font = cv2.FONT_HERSHEY_COMPLEX
cv2.putText(img,text='bricks',org=(10,600), fontFace=font,fontScale= 10,color=(255,0,0),thickness=4)
plt.imshow(img)
blurred_img = cv2.GaussianBlur(img,(11,11),10)
plt.imshow(blurred_img)
深度學習中使用OpenCV進行圖像處理

深度學習中使用OpenCV進行圖像處理

1.原始圖像 2.模糊圖像

(3)使用中值模糊和雙邊濾波進行去噪 - 雙邊濾波是一種眾所周知的去噪濾波器,用於高斯噪聲或圖像中的任何隨機噪聲

使用Opencv進行去噪處理

img = cv2.imread('../DATA/sammy.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img)
noise_img = cv2.imread('../DATA/sammy_noise.jpg')
plt.imshow(noise_img)
深度學習中使用OpenCV進行圖像處理

深度學習中使用OpenCV進行圖像處理

1.原始圖像 2.噪聲圖像

median = cv2.medianBlur(noise_img,5)
bilateral = cv2.bilateralFilter(noise_img,9,75,75)
plt.imshow(median)
plt.imshow(bilateral)
深度學習中使用OpenCV進行圖像處理

深度學習中使用OpenCV進行圖像處理

1.通過中值模糊消除 2.由雙邊濾波器消除

三、圖像處理的基礎知識

1、圖像形態學操作

它們包括以下內容

  1. 侵蝕 - 侵蝕前景物體的邊界。當前景為淺色(最好為白色),背景為深色時效果最佳。
  2. 膨脹 - 膨脹操作與腐蝕操作相反,是將圖像的輪廓加以膨脹!
  3. 開操作 - 開操作就是對圖像先腐蝕,再膨脹,其中腐蝕與膨脹的大小是一樣的。有助於消除背景噪音!
  4. 閉操作 - 它是開操作的反轉,它可用於去除前景對象的噪點,例如白色文本頂部的黑點。

(1)讓我們嘗試使用OpenCV進行侵蝕與膨脹操作

創建一個黑色背景和白色字母的圖像,並使用OpenCV函數應用侵蝕和膨脹。

def load_img():
blank_img =np.zeros((600,600))
font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(blank_img,text='OpenCV',org=(10,300),
fontFace=font,fontScale= 5,
color=(255,255,255),
thickness=25,lineType=cv2.LINE_AA)
return blank_img
plt.imshow(load_img())
## Erosion
kernel = np.ones((9,9),np.uint8)
erosion1 = cv2.erode(img,kernel,iterations = 1)
plt.imshow(erosion1)
dilation = cv2.dilate(erosion1,kernel,iterations=3)
plt.imshow(dilation)
深度學習中使用OpenCV進行圖像處理

深度學習中使用OpenCV進行圖像處理

1.原始圖像 2.侵蝕圖像 3.膨脹圖像

使用不同的內核大小和迭代可以得到不同的結果!

(2)開操作

由於該操作對於消除背景噪聲很有用。我們將使用開操作添加噪聲並將其刪除。

背景為黑色時添加白色的噪聲

img = load_img()
white_noise = np.random.randint(low=0,high=2,size=(600,600))
##to make the noisy image as same as original image
white_noise = white_noise*255
noise_img = white_noise+img
plt.imshow(noise_img)
opening = cv2.morphologyEx(noise_img, cv2.MORPH_OPEN, kernel)
plt.imshow(opening)
深度學習中使用OpenCV進行圖像處理

深度學習中使用OpenCV進行圖像處理

1.原始圖像 2.噪聲圖像 3.去噪圖像

(3)閉操作

由於閉操作有助於去除前景對象中的噪聲,我們將在前景對象上添加黑噪聲。

img = load_img()
black_noise = np.random.randint(low=0,high=2,size=(600,600))
black_noise= black_noise * -255
black_noise_img = img + black_noise
black_noise_img[black_noise_img==-255] = 0
plt.imshow(black_noise_img)
closing = cv2.morphologyEx(black_noise_img, cv2.MORPH_CLOSE, kernel)
plt.imshow(closing)
深度學習中使用OpenCV進行圖像處理

深度學習中使用OpenCV進行圖像處理

1.原始圖像 2.噪聲圖像 3.去噪圖像

(4)膨脹與侵蝕的區別

img = load_img()
gra = dilation - erosion1
plt.imshow(gra)

這可以通過形態學算子的梯度運算來完成

gradient = cv2.morphologyEx(img,cv2.MORPH_GRADIENT,kernel)
plt.imshow(gradient)
深度學習中使用OpenCV進行圖像處理

深度學習中使用OpenCV進行圖像處理

1.梯度的差異 2.內置函數的梯度

2、邊緣檢測

瞭解梯度將使我們最終理解邊緣檢測。基於梯度概念的邊緣檢測的基本方法是Sobel算子,使用OpenCV可以輕鬆地實現

img = cv2.imread('../DATA/sudoku.jpg',0)
sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=5)
sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=5)
blended = cv2.addWeighted(src1=sobelx,alpha=0.5,src2=sobely,beta=0.5,gamma=0)
深度學習中使用OpenCV進行圖像處理

深度學習中使用OpenCV進行圖像處理

1.原始圖像 2.Sobel-x 3.Sobel-y

深度學習中使用OpenCV進行圖像處理

混合圖像作為邊緣檢測

結論

圖像處理對於將圖像轉換為數字形式非常重要,它用於增強圖像數據並從中提取有用信息,本文講解的是基礎的使用OpenCV進行圖像處理。後續我們還將更深入的講解OpenCV。


相關推薦

推薦中...