[opencv]像素操作的数字图像处理

之前几天捣鼓matlab,用来处理数字图像,矩阵操作什么的,如果忘记线性代数就真的GG了。

在用了matlab被深深地吐槽之后,决定改用opencv,C++貌似也是处理数字图像的很好的工具

1. 在ubuntu上安装opencv

教程可以百度之,都很详细的

2. 像素处理图像:

(1)根据输入的数据,用邻近取样插值法,缩放图像

邻近取样插值法原理:http://blog.chinaunix.net/uid-27675161-id-3452025.html

   (2)根据输入,改变数字图像的灰度分辨率

(3)此次实验操作用灰度图来实现

3. 直接贴代码+注释吧

  1 //my_hw1.cpp
  2 #include <stdio.h>
  3 #include<iostream>
  4 #include <opencv2/opencv.hpp>
  5 #include<opencv2/core/core.hpp>
  6 #include<opencv2/highgui/highgui.hpp>
  7
  8 using namespace cv;
  9 using namespace std;
 10
 11 string my_pic = "07.png";
 12 Mat image = imread(my_pic, CV_LOAD_IMAGE_GRAYSCALE);
 13
 14 void on_trackbar(int p, void*) {
 15
 16 //************************Scale***************************
 17         //每次回调都重新载入图像
 18     Mat src = imread(my_pic, CV_LOAD_IMAGE_GRAYSCALE);
 19
 20         //获取三个滑动条的值
 21     int c = cvGetTrackbarPos("Width", "after change");
 22     int r = cvGetTrackbarPos("Height", "after change");
 23     int level = cvGetTrackbarPos("Level", "after change");
 24
 25         //记录原始图的宽高,以及对应的点sx,sy(邻近取样插值法中用到)
 26     int sh = src.rows;
 27     int sw = src.cols;
 28     int sx, sy;
 29
 30         //重置后的新图片
 31     Mat dst(r, c, src.type());
 32
 33         //填充新图片的像素
 34     for (int i = 0; i < r; i ++) {
 35         for (int j = 0; j < c; j ++) {
 36             double x = i / (r + 0.0);
 37             double y = j / (c + 0.0);
 38             sx = sh * x;
 39             sy = sw * y;
 40             dst.at<uchar>(i, j) = src.at<uchar>(sx,sy);
 41         }
 42     }
 43
 44 //********************Quantization************************
 45
 46     //使得level的值合法
 47     if (level <= 256 && level >= 128)level = 128;
 48     else if(level < 128 && level >= 64)level = 64;
 49     else if(level < 64 && level >= 32)level = 32;
 50     else if(level < 32 && level >= 16) level = 16;
 51     else if(level < 16 && level >= 8)level = 8;
 52     else if(level < 8 && level >= 4)level = 4;
 53     else level = 2;
 54
 55     int channels = dst.channels();
 56     int nrows = dst.rows;
 57     int ncols = dst.cols * channels;
 58
 59     uchar table[256];
 60     int degree = 255/(level - 1);
 61     int number = 256 / level;
 62     int count = 0;
 63     int value = 0;
 64
 65         //设定好要求的灰度映射
 66     for (int i = 0; i < 256; i ++, count ++) {
 67         if (count < number) table[i] = value;
 68         else {
 69             count = 0;
 70             value += degree;
 71             table[i] = value;
 72         }
 73     }
 74
 75     if (src.isContinuous()) {
 76         ncols *= nrows;
 77         nrows = 1;
 78     }
 79
 80     for (int i = 0; i < nrows; i ++) {
 81         uchar *p = dst.ptr<uchar>(i);
 82         for (int j = 0; j < ncols; j ++) {
 83             p[j] = table[p[j]];
 84         }
 85     }
 86
 87     //cout << level << " " << c << " " << r << "\n";
 88         imshow("after change", dst);
 89 }
 90
 91 int main( int argc, char** argv) {
 92     imshow("before change", image);
 93
 94     int width = 384;
 95     int height = 256;
 96     int level = 256;
 97     namedWindow("after change", CV_WINDOW_AUTOSIZE);
 98     createTrackbar( "Width", "after change", &width, 800, on_trackbar);
 99     createTrackbar( "Height", "after change", &height, 500, on_trackbar);
100     createTrackbar( "Level", "after change", &level, 256, on_trackbar); //slider
101
102     on_trackbar(0, 0);
103
104     waitKey();
105     return 0;
106 }
107     

另外,我选择的编译方式是cmake + make;

CMakeLists.txt

1 cmake_minimum_required(VERSION 2.8)
2 project( my_hw1 )
3 find_package( OpenCV REQUIRED )
4 add_executable( my_hw1 my_hw1.cpp )
5 target_link_libraries( my_hw1 ${OpenCV_LIBS} )

CMakeLists.txt

把相应的图片放到同目录的文件夹内,进入到该文件夹,输入命令行

cmake .

make

./my_hw1

就可以执行了~~

最后贴上一个运行结果图:

时间: 2024-10-14 04:13:42

[opencv]像素操作的数字图像处理的相关文章

数字图像处理作业使用OpenCV - 使用笔记

数字图像处理作业的输入图像全部都是灰度图像,所以汇总一下自己遇到的问题答案. OCV的图像容器是Mat<typename>,可以用imread(filename)读取图像,filename是c string,char*和const char*都行.灰度图像的typename是uchar,RGB图像的typename是Vec3b. Mat容器如果直接使用操作符赋值,只会复制一份信息头而不会复制包含数据的矩阵,由此而降低内存的浪费和速度,所以这样得到的多个Mat对象都指向同一个数据矩阵,换句话说,

OpenCV 学习(像素操作 Manipuating the Pixels)

OpenCV 学习(像素操作 Manipuating the Pixels) OpenCV 虽然提供了许多类型的图像处理函数,可以对图像进行各种常见的处理,但是总会有些操作时没有的,这时我们就需要自己来操纵像素,实现我们需要的功能.今天就来讲讲 OpenCV 进行像素级操作的几种方法,并做个比较. 在 OpenCV 中,图像用矩阵来表示,对应的数据类型为 cv::Mat . cv::Mat 功能很强大,矩阵的元素可以为字节.字.浮点数.数组等多种形式.对于灰度图像,每个像素用一个 8 bit 字

数字图像处理之python篇四:图像中的像素访问

前面的一些例子中,我们都是利用Image.open()来打开一幅图像,然后直接对这个PIL对象进行操作.如果只是简单的操作还可以,但是如果操作稍微复杂一些,就比较吃力了.因此,通常我们加载完图片后,都是把图片转换成矩阵来进行更加复杂的操作. python中利用numpy库和scipy库来进行各种数据操作和科学计算.我们可以通过pip来直接安装这两个库 pip install numpy pip install scipy 以后,只要是在python中进行数字图像处理,我们都需要导入这些包: fr

OpenCV基础(二)---图像像素操作

图像像素操作 通过访问图像的像素,对灰度图像和RGB图像进行反差. 例如,在灰度图像中,某一个像素值为,pixel_value. 那么反差后的pixel_value = 255 - pixel_value. 对RGB图像处理类似,差别在于要对每一个颜色通道进行反差. 方法1: 1 #include <opencv2/opencv.hpp> 2 #include <iostream> 3 4 using namespace cv; 5 using namespace std; 6 7

MATLAB数字图像处理(一)基础操作和傅立叶变换

数字图像处理是一门集计算机科学.光学.数学.物理学等多学科的综合科学.随着计算机科学的发展,数字图像处理技术取得了巨大的进展,呈现出强大的生命力,已经在多种领域取得了大量的应用,推动了社会的发展.其中,遥感领域中,对于影像数据的处理均基于数字图像处理的技术.而遥感影像数据作为地理信息科学的重要数据源,如何从中获取有用的信息,是地理信息数据处理中重要的内容. MATLAB作为数学领域应用最广泛的一种软件,集成了对于图片处理的函数和功能,成为了处理数字图像问题的佼佼者.其出众的计算能力和简便的绘图能

Opencv中图像的遍历与像素操作

Opencv中图像的遍历与像素操作 OpenCV中表示图像的数据结构是cv::Mat,Mat对象本质上是一个由数值组成的矩阵.矩阵的每一个元素代表一个像素,对于灰度图像,像素是由8位无符号数来表示(0代表黑,255代表白):对于彩色图像,每个像素是一个三元向量,即由三个8位无符号数来表示三个颜色通道(Opencv中顺次为蓝.绿.红). 我们先来介绍下cv::Mat类的获取像素的成员函数at(),其函数原型如下: template<typename _Tp> _Tp& at(int i0

【数字图像处理】七.MFC图像增强之图像普通平滑、高斯平滑、Laplacian、Sobel、Prewitt锐化详解

本文主要讲述基于VC++6.0 MFC图像处理的应用知识,主要结合自己大三所学课程<数字图像处理>及课件进行讲解,主要通过MFC单文档视图实现显示BMP图像增强处理,包括图像普通平滑.高斯平滑.不同算子的图像锐化知识.希望该篇文章对你有所帮助,尤其是初学者和学习图像处理的学生. [数字图像处理]一.MFC详解显示BMP格式图片 [数字图像处理]二.MFC单文档分割窗口显示图片 [数字图像处理]三.MFC实现图像灰度.采样和量化功能详解 [数字图像处理]四.MFC对话框绘制灰度直方图 [数字图像

OpenCV与MFC通用型图像处理开发实践

imagehandler 该程序的起源说来话长,它起源自上课的一次作业,后来又由于接触了OpenCV这个开源库,我就试图将OpenCV和MFC搓到一块,毕竟微软近来在界面上也下了狠功夫,尤其是Windows 7大获成功,而WP7.5和Windows 8跃跃欲试.结合Windows桌面也不失为一个有益的尝试. 关于imagehandler 本程序是在 MFC 中使用 OpenCV 处理图像的演示程序,由2部分组成. 背景知识: OpenCV是Intel?开源计算机视觉库.它由一系列 C 函数和少量

《数字图像处理原理与实践(MATLAB版)》一书之代码Part8

本文系<数字图像处理原理与实践(MATLAB版)>一书之代码系列的Part8,辑录该书第375至第415页之代码,供有需要读者下载研究使用.至此全书代码发布已经接近尾声,希望这些源码能够对有需要的读者有所帮助.代码执行结果请参见原书配图,建议下载代码前阅读下文: 关于<数字图像处理原理与实践(MATLAB版)>一书代码发布的说明 http://blog.csdn.net/baimafujinji/article/details/40987807 P385-1 function y