关闭

图像处理提取图像的奇数行列-学习笔记1

标签: opencvc++
342人阅读 评论(0) 收藏 举报
分类:

图像处理提取图像的奇数行列-学习笔记

版本vs2015(C++) opencv3.0
刚开始学习图像处理,想做个学习记录。与大家一起学习,本文以所做的实验为路线,记录完成实验的过程及思路。

要求: 下载任意图片,读取该图像。取上述图像的奇数行和奇数列数据,显示结果。
先附上显示结果

这里写图片描述

这里写图片描述

关于图像载入 显示的说明。

C++ 用cv::Mat 来表示图像或矩阵的数据结构。首先创建一个Mat,然后用imread()函数读取图像

Mat img = imread("D:\\\\3.jpg");

显示应先用namedWindow(“原图”);创建一个窗口,再用imshow(窗口名,mat)来显示。

namedWindow("原图");

imshow("原图", img);

将图像保存成文件可以用imwrite(图像路径,mat)来完成。

imwrite("D:\\\\3.jpg",img);

进入正题,如何将图像的奇数行列图取出来成为一个新图像呢?

1.要提取数据到另一个矩阵中那么就需要创建两个矩阵,一个为原图,另一个为结果图。结果图的大小为原图1/4
    Mat imgf = imread("D:\\乱\\3.jpg");
    /**********************************************/
    int nl = imgf.rows;
    int nc = imgf.cols;

    Mat img(nl/2,nc/2,CV_8UC3, Scalar(0, 0, 255));

Mat构造函数 前两个参数为矩阵的 行列 ,第三个参为数宏定义CV_8UC3表示用8位表示一个通道,一共3个通道分别为RGB

2.然后要学会遍历图像的每个像素。代码如下。
    int nl = imgf.rows;
    int nc = imgf.cols * imgf.channels();//图像通道数彩色图像一般为3
    //遍历图像的每个像素  
    for (int j = 0; j<nl;++j)
    {
        uchar *data = imgf.ptr<uchar>(j);//行首地址传入
        for (int i = 0; i<nc*3; ++i) //3为通道数
        {
            //具体内容data[i]
        }
    }
3.现在就从中提取奇数行列,注意每个像素有三个通道分别为RGB各8位,所以在每行按照uchar*指针类型进行遍历的时候要在原基础上乘3
    for (int j = 1, k = 0; j<nl;j += 2, k++)
    {
        uchar *data = imgf.ptr<uchar>(j);//取奇数行遍历
        uchar *data2 = img.ptr<uchar>(k);
        for (i = 3, v = 0; i < nc * 3;i += 6, v += 3) //每一个像素包含RGB24位,所以取奇数列则隔68位,进行获取。
        {
            data2[v] = data[i];
            data2[v + 1] = data[i + 1];
            data2[v + 2] = data[i + 2];
        }
    }

第一次写笔记终于结束了。
完整源码如下:

#include <opencv2/core/core.hpp>  
#include <opencv2/highgui/highgui.hpp>  

using namespace cv;

int main()
{
    Mat imgf = imread("D:\\乱\\3.jpg");
    /**********************************************/
    int nl = imgf.rows;
    int nc = imgf.cols;

    Mat img(nl / 2, nc / 2, CV_8UC3, Scalar(0, 0, 255));
    int v = 0, i = 1, j = 0, k = 0;

    //遍历图像的每个像素  
    for (int j = 1, k = 0; j<nl;j += 2, k++)
    {
        uchar *data = imgf.ptr<uchar>(j);
        uchar *data2 = img.ptr<uchar>(k);
        for (i = 3, v = 0; i < nc * 3;i += 6, v += 3)
        {
            data2[v] = data[i];
            data2[v + 1] = data[i + 1];
            data2[v + 2] = data[i + 2];
        }
    }

    namedWindow("原图");

    imshow("原图", imgf);
    namedWindow("输出");

    imshow("输出", img);

    waitKey(0);
    return 0;
}
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:18360次
    • 积分:404
    • 等级:
    • 排名:千里之外
    • 原创:20篇
    • 转载:3篇
    • 译文:1篇
    • 评论:1条
    最新评论