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

原创 2015年11月17日 21:43:46

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

版本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;
}

opencv 一年多的初级总结

至2016.9.2 1 P127 addWeighted(imageRedChannel(Rect(500,250,logoImage.cols,logoImage.rows)),1.0,   ...

池化方法总结(Pooling)

FROM: http://demo.netfoucs.com/danieljianfeng/article/details/42433475# 在卷积神经网络中,我们经常会碰到池化操...

池化总结(OverlappingPooling、 一般池化、Spatial Pyramid Pooling)

池化方法总结(Pooling) 在卷积神经网络中,我们经常会碰到池化操作,而池化层往往在卷积层后面,通过池化来降低卷积层输出的特征向量,同时改善结果(不易出现过拟合)。 为什么可以通过降低维度呢? 因...

池化方法总结(Pooling)

在卷积神经网络中,我们经常会碰到池化操作,而池化层往往在卷积层后面,通过池化来降低卷积层输出的特征向量,同时改善结果(不易出现过拟合)。 为什么可以通过降低维度呢? 因为图像具有一种“静态...

像素级的图像处理---opencv.2学习笔记1

一、图像中对像素的操作 #include "stdafx.h" #include using namespace std; using namespace cv; void salt(Mat &...

数字图像处理与OpenCV(3-1)--存取像素

为了存取矩阵元素,需要在代码中指定元素所在的行和列。程序

图像处理学习笔记1 下采样和上采样

# 图像处理学习笔记1 下采样和上采样           转自:http://baike.baidu.com/view/3038019.htm和http://blog.sina.com.cn/s/b...

图像处理ORB特征学习笔记(1)

关键点:使用Harris角点检测寻找FAST关键点。初始时,选取低阀值,使获取的关键点数目大于N。再根据Harris测量,为关键点排序,选取测量值高的N个点做关键点。Harris角滤波器丢弃边缘。用质...

Matlab图像处理学习笔记(一):二值化、开操作、连通区域提取、重心、ROI

本博客主要记录我学习运用matlab进行一些基本的图像处理的一些笔记,如果有不当的地方,欢迎批评指正,一起学习,一起进步。 本篇是第一篇,只涉及到一些基本的操作,涉及到的知识点如下: 1、二值化 ...

vc图像处理学习笔记1-图像格式分析及显示

第一节 图像的文件格式   要利用计算机对数字化图像进行处理,首先要对图像的文件格式要有清楚的认识,因为我们前面说过,自然界的图像以模拟信号的形式存在,在用计算机进行处理以前,首先要数字化,比如...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:图像处理提取图像的奇数行列-学习笔记1
举报原因:
原因补充:

(最多只允许输入30个字)