天天看點

matlab 三維顯示原圖像_計算機視覺學習筆記3 圖像的像素運算圖像點運算圖像的代數運算MATLAB實作圖像代數運算c++實作圖像的代數運算

圖像本質上來講就是一個矩陣,矩陣中每一個元素都對應着像素點的像素值,是以矩陣中的每個元素都是能進行代數運算,點運算和邏輯運算的。

做神經網絡和三維點雲去了,這些基礎知識一段時間了不用就忘完了,再複習一下。

圖像點運算

點運算又稱為對比度增強,對比度拉伸或灰階拉伸,是通過圖像中的每一個像素值進行運算的圖像處理方式,運算不會改變圖像像素點之間的空間關系。

MATLAB中通過 imadjust()進行線性灰階變換還可以把圖像當做一個函數來進行非線性灰階變換
           

圖像的代數運算

  • 圖像的加法運算

加法運算主要是将一幅圖像内容疊加到另一幅圖像上,或者對每個像素疊加常數改變其亮度。

調用方法:

result 為輸出結果,img1和img2為要疊加的圖像

MATLAB: result = imadd(img1, img2); c++ : add(img1, img2, result);python: cv.add(img1, img2, result)
           
  • 圖像的減法運算

圖像減法運算也叫差分方法,是一種常用于檢測圖像變換及運動物體的圖像處理方法。比如可以用來檢測一系列相同場景之間的差異

值得注意的是,圖像相減次序不同結果也不一樣的。

調用方法:

MATLAB: result = imsubtract(img1, img2);c++ : subtract(img1, img2, result);python: cv.subtract(img1, img2, result);
           
  • 圖像的乘法運算

圖像的乘法運算一般來講沒啥用,可以用來屏蔽圖像的某些部分,或者是乘某個常數因子,比如1.5或者0.5,用來增強圖像亮度或則變暗。

調用方法:

MATLAB: result = immultiply(img1, img2);c++ : multiply(img1, img2, result);python: cv.multiply(img1, img2, result);
           
  • 圖像的除法運算

圖像的除法運算好像也沒啥用,能得到兩幅圖像之間的變化率,是以圖像除法也稱為比率變換,用來校正成像裝置的非線性影響。

調用方法:

MATLAB: result = imdivide(img1, img2);c++ : divide(img1, img2, result);python: cv.divide(img1, img2, result);
           

相信大家也看出來了,調用方法就是四則運算的名稱,并且MATLAB幹啥都喜歡加上im,如imadd,c++比較直接,python需要加上字首cv.。

MATLAB實作圖像代數運算

代碼後面有注釋,就不在正文中講解了。用到了四個圖像,示例圖像OpenCV或者MATLAB自帶的庫裡面都能找到。

matlab 三維顯示原圖像_計算機視覺學習筆記3 圖像的像素運算圖像點運算圖像的代數運算MATLAB實作圖像代數運算c++實作圖像的代數運算

原始圖像

matlab 三維顯示原圖像_計算機視覺學習筆記3 圖像的像素運算圖像點運算圖像的代數運算MATLAB實作圖像代數運算c++實作圖像的代數運算

原始圖像

img1 = imread('data/rice.bmp'); img2 = imread('data/cameraman.tif'); img3 = imread('data/ipexroundness_02.png');img4 = imread('data/ipexroundness_01.png');add1 = imadd(img1,img2); %進行兩幅圖像的加法運算add2 = imadd(img2, 50); %每個像素值增加30gs = imnoise(img3,'gaussian',0,0.5); %加入高斯白噪聲for i=1:3 % 疊加三次高斯噪聲 gs=imadd(gs, img3); %對用原圖像與帶噪聲圖像進行多次疊加,結果傳回給endsub1 = imsubtract(img3, img4); % 圖像減法sub2 = imsubtract(img4, img3);mul = immultiply(img3, img4); % 圖像乘法div = imdivide(img3, img4); % 圖像除法imshow(gs);title('添加高斯噪聲');figure;imshow(mul);title('圖3乘圖4');略。。。
           
matlab 三維顯示原圖像_計算機視覺學習筆記3 圖像的像素運算圖像點運算圖像的代數運算MATLAB實作圖像代數運算c++實作圖像的代數運算

加法後圖像

matlab 三維顯示原圖像_計算機視覺學習筆記3 圖像的像素運算圖像點運算圖像的代數運算MATLAB實作圖像代數運算c++實作圖像的代數運算

減法後圖像

matlab 三維顯示原圖像_計算機視覺學習筆記3 圖像的像素運算圖像點運算圖像的代數運算MATLAB實作圖像代數運算c++實作圖像的代數運算

圖像加法中添加高斯噪聲

matlab 三維顯示原圖像_計算機視覺學習筆記3 圖像的像素運算圖像點運算圖像的代數運算MATLAB實作圖像代數運算c++實作圖像的代數運算

相乘後的圖像

c++實作圖像的代數運算

直接上代碼,c++沒有內建一個圖像框顯示多個圖像的功能,是以添加了mergeImg子產品,把四個圖像放進去。

#include #include #include using namespace cv;using namespace std;// 聲明一個大的Mat視窗,把四個圖像放進去// Rect提取ROI區域,然後copyto到ROI區域void mergeImg(Mat & dst, Mat & img1, Mat &img2, Mat &img3, Mat &img4){ int row = img1.rows + 10 + img2.rows; int col = img1.cols + 10 + img2.cols; CV_Assert(img1.type() == img2.type()); dst.create(row, col, img1.type()); img1.copyTo(dst(Rect(0,0,img1.cols, img1.rows))); img2.copyTo(dst(Rect(img1.cols + 10, 0,img2.cols, img2.rows))); img3.copyTo(dst(Rect(0, img1.rows + 10, img3.cols, img3.rows))); img3.copyTo(dst(Rect(img1.cols +10, img1.rows + 10, img4.cols, img4.rows)));}int main(int argc, char **argv){ Mat img1 = imread("data/images/cameraman.tif"); Mat img2 = imread("data/images/rice.bmp"); if (img1.empty() || img2.empty()){ cerr << "Could't load image "; return -1; } Mat add_result = Mat::zeros(img1.size(), img1.type()); add(img1, img2, add_result); // 加法 Mat sub_result = Mat::zeros(img1.size(), img1.type()); subtract(img1, img2, sub_result); // 減法 Mat mul_result = Mat::zeros(img1.size(), img1.type()); multiply(img1, img2, mul_result); // 乘法 Mat div_result = Mat::zeros(img1.size(), img1.type()); divide(img1, img2, div_result); // 除法 Mat Image;  調用mergeImg,實作四個圖像一起顯示 mergeImg(Image, add_result, sub_result, mul_result, div_result); namedWindow("Image