opencv3/C++圖像像素操作詳解
RGB圖像轉(zhuǎn)灰度圖
RGB圖像轉(zhuǎn)換為灰度圖時(shí)通常使用:

進(jìn)行轉(zhuǎn)換,以下嘗試通過其他對圖像像素操作的方式將RGB圖像轉(zhuǎn)換為灰度圖像。
#include<opencv2/opencv.hpp>
#include<math.h>
using namespace cv;
int main()
{
//像素操作
Mat src,dst;
src = imread("E:/image/image/daibola.jpg");
if(src.empty())
{
printf("can not load image \n");
return -1;
}
namedWindow("input");
imshow("input",src);
dst.create(src.size(), src.type());
for(int row = 0; row < src.rows; row++)
{
for(int col = 0; col < src.cols; col++)
{
int b = src.at<Vec3b>(row, col)[0];
int g = src.at<Vec3b>(row, col)[1];
int r = src.at<Vec3b>(row, col)[2];
dst.at<Vec3b>(row, col)[0] = max(r,max(g,b));
dst.at<Vec3b>(row, col)[1] = max(r,max(g,b));
dst.at<Vec3b>(row, col)[2] = max(r,max(g,b));
}
}
namedWindow("output");
imshow("output",dst);
waitKey();
}

同理使用min(r,min(g,b))可以看到由于選擇了較小的灰度值圖像會明顯變暗:

圖像線性增強(qiáng)
通過對圖像像素操作(線性變換),實(shí)現(xiàn)圖像的線性增強(qiáng)。
#include<opencv2/opencv.hpp>
#include<math.h>
using namespace cv;
int main()
{
Mat src1, dst;
src1 = imread("E:/image/image/im1.jpg");
if(src1.empty())
{
printf("can not load im1 \n");
return -1;
}
double alpha = 1.2, beta = 50;
dst = Mat::zeros(src1.size(), src1.type());
for(int row = 0; row < src1.rows; row++)
{
for(int col = 0; col < src1.cols; col++)
{
if(src1.channels() == 3)
{
int b = src1.at<Vec3b>(row, col)[0];
int g = src1.at<Vec3b>(row, col)[1];
int r = src1.at<Vec3b>(row, col)[2];
dst.at<Vec3b>(row, col)[0] = saturate_cast<uchar>(b*alpha + beta);
dst.at<Vec3b>(row, col)[1] = saturate_cast<uchar>(g*alpha + beta);
dst.at<Vec3b>(row, col)[2] = saturate_cast<uchar>(r*alpha + beta);
}
else if (src1.channels() == 1)
{
float v = src1.at<uchar>(row, col);
dst.at<uchar>(row, col) = saturate_cast<uchar>(v*alpha + beta);
}
}
}
namedWindow("output",CV_WINDOW_AUTOSIZE);
imshow("output", dst);
waitKey();
return 0;
}


掩膜操作調(diào)整圖像對比度
使用一個(gè)3×3掩模增強(qiáng)圖像對比度:

#include<opencv2/opencv.hpp>
#include<math.h>
using namespace cv;
int main()
{
Mat src, dst;
src = imread("E:/image/image/daibola.jpg");
CV_Assert(src.depth() == CV_8U);
if(!src.data)
{
printf("can not load image \n");
return -1;
}
src.copyTo(dst);
for(int row = 1; row<(src.rows - 1); row++)
{
const uchar* previous = src.ptr<uchar>(row - 1);
const uchar* current = src.ptr<uchar>(row);
const uchar* next = src.ptr<uchar>(row + 1);
uchar* output = dst.ptr<uchar>(row);
for(int col = src.channels(); col < (src.cols - 1)*src.channels(); col++)
{
*output = saturate_cast<uchar>(9 * current[col] - 2*previous[col] - 2*next[col] - 2*current[col - src.channels()] - 2*current[col + src.channels()]);
output++;
}
}
namedWindow("image", CV_WINDOW_AUTOSIZE);
imshow("image",dst);
waitKey();
return 0;
}

像素重映射
利用cv::remap實(shí)現(xiàn)像素重映射;
cv::remap參數(shù)說明:
Remap( InputArray src,// 輸入圖像 OutputArray dst,// 輸出圖像 InputArray map1,// 映射表1(CV_32FC1/CV_32FC2) InputArray map2,// 映射表2(CV_32FC1/CV_32FC2) int interpolation,// 選擇的插值 int borderMode,// 邊界類型(BORDER_CONSTANT) const Scalar borderValue// 顏色 )
插值方法:
CV_INTER_NN =0, CV_INTER_LINEAR =1, CV_INTER_CUBIC =2, CV_INTER_AREA =3, CV_INTER_LANCZOS4 =4
通過像素重映射實(shí)現(xiàn)圖像垂直翻轉(zhuǎn):
#include<opencv2/opencv.hpp>
using namespace cv;
int main()
{
Mat src,dst;
src = imread("E:/image/image/daibola.jpg");
if(src.empty())
{
printf("can not load image \n");
return -1;
}
namedWindow("input", CV_WINDOW_AUTOSIZE);
imshow("input", src);
Mat mapx,mapy;
mapx.create(src.size(), CV_32FC1);
mapy.create(src.size(), CV_32FC1);
for(int row = 0; row < src.rows; row++)
{
for(int col = 0; col < src.cols; col++)
{
mapx.at<float>(row, col) = col;
mapy.at<float>(row, col) = src.rows - row - 1;
}
}
remap(src, dst, mapx, mapy, CV_INTER_NN, BORDER_CONSTANT, Scalar(0,255,255));
namedWindow("output", CV_WINDOW_AUTOSIZE);
imshow("output",dst);
waitKey();
return 0;
}

以上這篇opencv3/C++圖像像素操作詳解就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python編程pytorch深度卷積神經(jīng)網(wǎng)絡(luò)AlexNet詳解
AlexNet和LeNet的架構(gòu)非常相似。這里我們提供了一個(gè)稍微精簡版本的AlexNet,去除了當(dāng)年需要兩個(gè)小型GPU同時(shí)運(yùn)算的設(shè)計(jì)特點(diǎn)2021-10-10
python正則表達(dá)式re.sub各個(gè)參數(shù)的超詳細(xì)講解
Python 的 re 模塊提供了re.sub用于替換字符串中的匹配項(xiàng),下面這篇文章主要給大家介紹了關(guān)于python正則表達(dá)式re.sub各個(gè)參數(shù)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07
python 實(shí)現(xiàn)列表的切片操作允許索引超出范圍
這篇文章主要介紹了python 實(shí)現(xiàn)列表的切片操作允許索引超出范圍,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-05-05
Django數(shù)據(jù)庫如何在原有表中添加新字段
這篇文章主要介紹了Django數(shù)據(jù)庫如何在原有表中添加新字段問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09
如何利用Python+OpenCV實(shí)現(xiàn)簡易圖像邊緣輪廓檢測(零基礎(chǔ))
輪廓是形狀分析和物體檢測和識別的有用工具,下面這篇文章主要給大家介紹了關(guān)于如何利用Python+OpenCV實(shí)現(xiàn)簡易圖像邊緣輪廓檢測(零基礎(chǔ))的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-05-05

