一、图像反色
用255减去每个像素值,得到一个心图像,这里使用迭代器和LUT(look up table )两种方法。
1.用迭代器
#include <highgui.h>
using namespace std ;
using namespace cv ;
int main(int argc,char ** argv)
{
Mat image = imread(argv[1],1) ;
imshow("image" , image) ;
cv::Mat tempImage = image.clone();
// 初始化源图像迭代器
cv::MatConstIterator_<cv::Vec3b> srcIterStart = image.begin<cv::Vec3b>();
cv::MatConstIterator_<cv::Vec3b> srcIterEnd = image.end<cv::Vec3b>();
// 初始化输出图像迭代器
cv::MatIterator_<cv::Vec3b> resIterStart = tempImage.begin<cv::Vec3b>();
cv::MatIterator_<cv::Vec3b> resIterEnd = tempImage.end<cv::Vec3b>();
// 遍历图像反色处理
while( srcIterStart != srcIterEnd )
{
(*resIterStart)[0] = 255 - (*srcIterStart)[0];
(*resIterStart)[1] = 255 - (*srcIterStart)[1];
(*resIterStart)[2] = 255 - (*srcIterStart)[2];
// 迭代器递增
srcIterStart++;
resIterStart++;
}
imshow("outputimage",tempImage);
waitKey(0) ;
return 0 ;
}
2.用LUT
该函数可进行图像像素查找,扫描,操作
#include <highgui.h>
using namespace std ;
using namespace cv ;
int main(int argc,char ** argv)
{
Mat image = imread(argv[1],1) ;
imshow("image" , image) ;
int row = image.rows;
int col = image.cols;
cv::Mat tempImage = image.clone();
// 建立LUT 反色table
uchar LutTable[256];
for (int i = 0; i < 256; ++i)
LutTable[i] = 255 - i;
cv::Mat lookUpTable(1, 256, CV_8U);
uchar* pData = lookUpTable.data;
// 建立映射表
for( int i = 0; i < 256; ++i)
pData[i] = LutTable[i];
// 应用索引表进行查找
cv::LUT(image, lookUpTable, tempImage);
imshow("outputimage",tempImage);
waitKey(0) ;
return 0 ;
}
结果如下:
二、图像平移
代码:
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
using namespace cv;
//平移后大小不变
void translateTransform(cv::Mat const& src, cv::Mat& dst, int dx, int dy)
{
CV_Assert(src.depth() == CV_8U);
const int rows = src.rows;
const int cols = src.cols;
dst.create(rows, cols, src.type());
Vec3b *p;
for (int i = 0; i < rows; i++)
{
p = dst.ptr<Vec3b>(i);
for (int j = 0; j < cols; j++)
{
//平移后坐标映射到原图像
int x = j - dx;
int y = i - dy;
//保证映射后的坐标在原图像范围内
if (x >= 0 && y >= 0 && x < cols && y < rows)
p[j] = src.ptr<Vec3b>(y)[x];
}
}
}
//平移后大小变化
void translateTransformSize(cv::Mat const& src, cv::Mat& dst, int dx, int dy)
{
CV_Assert(src.depth() == CV_8U);
const int rows = src.rows + abs(dy); //输出图像的大小
const int cols = src.cols + abs(dx);
dst.create(rows, cols, src.type());
Vec3b *p;
for (int i = 0; i < rows; i++)
{
p = dst.ptr<Vec3b>(i);
for (int j = 0; j < cols; j++)
{
int x = j - dx;
int y = i - dy;
if (x >= 0 && y >= 0 && x < src.cols && y < src.rows)
p[j] = src.ptr<Vec3b>(y)[x];
}
}
}
int main(int argc,char** argv)
{
Mat srcimage,dst,dst1;
srcimage=imread(argv[1],1);
namedWindow("src_window");
imshow("src_window",srcimage);
translateTransform(srcimage, dst,50, 50);
namedWindow("dst_window");
imshow("dst_window",dst);
translateTransformSize(srcimage,dst1, 50, 50);
namedWindow("dst_window1");
imshow("dst_window1",dst1);
waitKey(0);
}
1.大小不变的平移 结果显示如下
2.图像大小变化平移 结果如下