opencv3/C++图像像素操作
来源:互联网 发布:北京大红门淘宝培训班 编辑:程序博客网 时间:2024/06/05 02:50
RGB图像转灰度图
RGB图像转换为灰度图时通常使用:
进行转换,以下尝试通过其他对图像像素操作的方式将RGB图像转换为灰度图像。
#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))可以看到由于选择了较小的灰度值图像会明显变暗:
图像线性增强
通过对图像像素操作(线性变换),实现图像的线性增强。
#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;}
掩膜操作调整图像对比度
使用一个3×3掩模增强图像对比度:
#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实现像素重映射;
cv::remap参数说明:
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
通过像素重映射实现图像垂直翻转:
#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;}
阅读全文
0 0
- opencv3/C++图像像素操作
- Python OpenCV3 图像操作
- 快速图像像素操作
- android 操作图像像素
- 图像像素操作
- OpenGL: 图像像素操作
- 图像像素操作
- 图像像素操作
- 图像像素操作
- opencv3的图像腐蚀操作
- 图像的像素点操作
- OpenCV3.1中读写图像与读写像素
- opencv3.0访问像图像的像素值并显示
- BGRABitmap图像操作4:直接操作像素
- android学习笔记之图像像素操作
- C# 操作图像像素 变灰 画图
- opencv对图像像素进行操作
- MAT型图像的像素操作
- TP3.2复习笔记
- RecyclerView展示数据+跳转详情页
- 深度学习: gradient diffusion (梯度弥散)
- [Python][Numpy] ValueError: Integers to negative integer powers are not allowed.
- Linux 程序内存空间布局
- opencv3/C++图像像素操作
- 使用SSM框架搭建Web服务器实现登录功能(Spring+SpringMVC+Mybatis)
- Linux发行版进化史
- 【Sublime】设置 sublime Text3 中的 Tab 键为 4 个空格
- Linux shell example
- 基于canvas使用粒子拼出你想要的文字[2]——粒子的动画效果
- codeforces 479A Expression
- hive函数
- zookeeper启动过程函数调用