Opencv学习笔记

一、图像反色


用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.图像大小变化平移 结果如下






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值