文章目錄
- 1 圖像遍歷與修改
- 1.1 使用數組
- 1.2 使用指針
- 2 圖像的算術運算
- 2.1 一般算術操作
- 2.2 算術API
1 圖像遍歷與修改
C++中支持 數組遍歷 和 指針方式遍歷
1.1 使用數組
訪問使用 image.at(row,col) 進行訪問
如果是單通道灰度圖,就使用image.at進行讀取
如果是三通道彩色圖,就使用Image.at進行讀取單個像素,通過 Image.at [0], Image.at[1], Image.at[2]讀取每個通道的數據
void QuickDemo::pixel_visit_demo(Mat &image)
{int w = image.cols;int h = image.rows;int dimis = image.channels();for (int row = 0; row < h; row++){for (int col = 0; col < w; col++){if (dimis == 1){// 灰色圖像 打印像素 幾行幾列的那個像素點int pv = image.at<uchar>(row, col);// 修改像素點image.at<uchar>(row, col) = 255 - pv;}if (dimis == 3){// 彩色圖像 專門獲取三通道的存儲Vec3b bgr = image.at<Vec3b>(row, col);image.at<Vec3b>(row, col)[0] = 255 - bgr[0];image.at<Vec3b>(row, col)[1] = 255 - bgr[1];image.at<Vec3b>(row, col)[2] = 255 - bgr[2];}}}imshow("像素讀寫演示", image);}
這邊就是對三通道進行一個取反
1.2 使用指針
使用image.ptr 進行遍歷
for (int row = 0; row < h; row++){uchar* current_row = image.ptr<uchar>(row);for (int col = 0; col < w; col++){if (dimis == 1){// 灰色圖像 打印像素 幾行幾列的那個像素點int pv = *current_row;// 修改像素點*current_row++ = 255 - pv;}if (dimis == 3){// 彩色圖像 專門獲取三通道的存儲*current_row++ = 255 - *current_row;*current_row++ = 255 - *current_row;*current_row++ = 255 - *current_row;}}}
2 圖像的算術運算
2.1 一般算術操作
Mat dst;dst = image + Scalar(50, 50, 50);imshow("加法測試");
同樣可以使用減法,除法
Mat dst;dst = image - Scalar(50, 50, 50);dst = image / Scalar(2, 2, 2);imshow("加法測試");
進行乘法時會報錯,這時候需要特殊操作
使用multiply 進行乘法操作
Mat dst;//dst = image + Scalar(50, 50, 50);Mat m = Mat::zeros(image.size(), image.type());multiply(image, m, dst);imshow("加法測試");
會進行截斷操作,超過255會變成255
為避免加法也會出現超過255的操作,使用C++的數據類型轉換,
saturate_cast(a,b);
Mat dst = Mat::zeros(image.size(), image.type());//dst = image + Scalar(50, 50, 50);Mat m = Mat::zeros(image.size(), image.type());/*multiply(image, m, dst);imshow("加法測試");*/m = Scalar(50, 50, 50);int w = image.cols;int h = image.rows;int dimis = image.channels();for (int row = 0; row < h; row++){for (int col = 0; col < w; col++){if (dimis == 1){// 灰色圖像 打印像素 幾行幾列的那個像素點int pv = image.at<uchar>(row, col);// 修改像素點image.at<uchar>(row, col) = 255 - pv;}if (dimis == 3){// 彩色圖像 專門獲取三通道的存儲Vec3b p1 = image.at<Vec3b>(row, col);Vec3b p2 = m.at<Vec3b>(row, col);image.at<Vec3b>(row, col)[0] = saturate_cast<uchar>(p1[0] + p2[0]);image.at<Vec3b>(row, col)[1] = saturate_cast<uchar>(p1[1] + p2[1]);image.at<Vec3b>(row, col)[2] = saturate_cast<uchar>(p1[2] + p2[2]);}}}
2.2 算術API
上節已經有乘法的API
multiply(第一個mat,第二個mat, 輸出結果);
加法
add(image, m, dst);
減法
subtract(image , m, dst)
除法
divide(image, m, dst)
multiply(image, m, dst);
add(image, m, dst);
subtract(image, m, dst);
divide(image, m, dst);