Opencv基礎入門筆記02

2021-10-01 20:36:52 字數 3493 閱讀 7235

我們都知道,是由乙個個畫素點組成的,那麼,我理解為乙個巨大的矩陣,而矩陣掩模,就是,自己定義了乙個特定的矩陣「kernel」或者叫「mask」,即掩模,然後,進行對矩陣的叉乘,是卷積濾波的一種體現,然後使呈現自己想要的樣子。

實際上,掩膜mask是一種影象濾鏡的模板,實用掩膜經常處理的是遙感影象。當提取道路或者河流,或者房屋時,通過乙個n*n的矩陣來對影象進行畫素過濾,然後將我們需要的地物或者標誌突出顯示出來。這個矩陣就是一種掩膜。在opencv中,掩模操作是相對簡單的。大致的意思是,通過乙個掩模矩陣,重新計算影象中的每乙個畫素值。掩模矩陣控制了舊影象當前位置以及周圍位置畫素對新影象當前位置畫素值的影響力度。用數學術語講,即我們自定義乙個權重表。

1.用到的主要函式(filter2d,mat,saturate_cast)

我們主要將掩模操作實現對比度的提高。用到的掩模為

mat kern = (mat_(3,3) <<  0, -1,  0,

-1, 5, -1,

0, -1, 0);

對應實際的數學計算公式為

i(i,j) = 5*i(i,j) - [i(i-1,j) + i(i+1,j) + i(i,j-1) + i(i,j+1)]

其中(i,j)是畫素點座標,i就是我們上面說的kernel或者叫掩模mask。這裡是3*3的矩陣掩模,計算後得到的值賦給矩陣掩模的中心錨點anchor(這裡就是kernel中5對應的畫素下的座標)

接下來講saturate_cast函式

這是畫素範圍處理saturate_cast()

saturate_cast(-100),返回0

saturate_cast(288),返回255

saturate_cast(100),返回100

的畫素值通常一般在0–255之間,這個函式的功能就是確保rgb值範圍在0~255之間。因為進行的濾波或者掩模,用公式計算得到的畫素值可能會**>255或者<0**,所以必須用這個函式保證。當然,也可以自己用**實現這個函式。

函式呼叫filter2d功能

filter2d 函式的定義如下:

void filter2d( inputarray src, outputarray dst, int ddepth,

inputarray kernel, point anchor=point(-1,-1),

double delta=0, int bordertype=border_default );

其中src與dst是mat型別變,ddepth是深度,delta是計算公式裡面的乙個係數,一般0。後面的引數bordertype是邊緣填充型別,用預設值。

函式作用是實現自定義卷積濾波,掩模操作屬於濾波範圍,所以可以用,不同的kernel能使實現不同的效果上面定義的kernel就是用於實現對比度的提高的

當然這個函式也是可以通過對畫素指標的獲取以及畫素指標的操作進行源**復現。

2.**過程

我將用c++與python實現上述的矩陣掩模操作,以及用c++語言實現saturate_cast函式及簡單實現filter2d

first,c++實現掩模操作

int main() 

//定義掩模mask(kernel)

mat kernel = (mat_(3,3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);//3*3的卷積核,注意是char型

//呼叫filter2d函式實現矩陣掩模操作

filter2d(src_image, dst_image, -1, kernel, point(-1, -1));

//顯示

imshow("src", src_image);

imshow("dst", dst_image);

waitkey(0);

return 0;

}

python實現上述功能

import cv2 as cv

import numpy as np

# 1.讀取

# 2.判斷是否讀入

if src_image is none:

print("can't load image ,please checkout your path!")

exit(0)

# 3.python沒有mat,用numpy定義掩模kernel(mask)

kernel = np.array(([0, -1, 0],

[-1, 5, -1],

[0, -1, 0]), dtype="float32")

# 4.呼叫filter2d實現矩陣掩模操作

dst_image = cv.filter2d(src_image, -1, kernel)

# 5.顯示

3.用c++實現filter2d函式對比度提高

int main() 

mat dst_image= mat::zeros(src_image.size(),src_image.type());

//定義掩模mask(kernel)

//mat kernel = (mat_(3,3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);//3*3的卷積核

//呼叫filter2d函式實現矩陣掩模操作

//filter2d(src_image, dst_image, -1, kernel, point(-1, -1));

//首先先獲取的高度,寬度,通道數

int col = (src_image.cols - 1)*src_image.channels();

int row = src_image.rows;

int channel = src_image.channels();

//遍歷畫素點

for (int i = 1; i < row - 1; i++) }

//顯示

未完,筆記先複習到現在,待查。

Opencv基礎入門筆記03

mat物件我們在學習影象處理的過程一直在接觸,那麼它到底是個什麼東西呢?當opencv 1.0發布時候沒有mat物件,是個c語言風格的資料結構iplimage來表示記憶體中影象物件,但是opencv開發者在做複雜影象處理演算法分析與計算時候,建立了很多iplimage這樣的資料結構,偶爾最後可能忘記...

Opencv基礎入門筆記04

今天覆習影象操作,包括影象的取反,二值化,作與運算等!1.簡述 我們知道灰度圖由0 255表示,0為黑,255為白,則從位操作的角度出發,純黑色為0,不是純黑色為1,所以在一些純白色,或者純黑色背景裡,先轉為灰度圖,利用閾值將非背景色的內容 灰度值不是0和255 摳出來作為模板,再與原圖做位操作,進...

Opencv基礎入門筆記06

1.影象對比度和亮度 首先,我們先說影象的變換,可以分成以下兩類 1 畫素變換 在畫素變換中,僅僅根據輸入的畫素值 有時可能加上某些全域性資訊或者引數 來計算相應的輸出畫素值。該類變換的常見方法有亮度和對比度調整 顏色校正和顏色變換等等。該類變換可以用下面的通用變換公式來表示。f x,y 表示原影象...