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

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

1. 在ubuntu上安装opencv

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

2. 像素处理图像:

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

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

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

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

3. 直接贴代码+注释吧

 //my_hw1.cpp
#include <stdio.h>
#include<iostream>
#include <opencv2/opencv.hpp>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp> using namespace cv;
using namespace std; string my_pic = "07.png";
Mat image = imread(my_pic, CV_LOAD_IMAGE_GRAYSCALE); void on_trackbar(int p, void*) { //************************Scale***************************
//每次回调都重新载入图像
Mat src = imread(my_pic, CV_LOAD_IMAGE_GRAYSCALE); //获取三个滑动条的值
int c = cvGetTrackbarPos("Width", "after change");
int r = cvGetTrackbarPos("Height", "after change");
int level = cvGetTrackbarPos("Level", "after change"); //记录原始图的宽高,以及对应的点sx,sy(邻近取样插值法中用到)
int sh = src.rows;
int sw = src.cols;
int sx, sy; //重置后的新图片
Mat dst(r, c, src.type()); //填充新图片的像素
for (int i = ; i < r; i ++) {
for (int j = ; j < c; j ++) {
double x = i / (r + 0.0);
double y = j / (c + 0.0);
sx = sh * x;
sy = sw * y;
dst.at<uchar>(i, j) = src.at<uchar>(sx,sy);
}
} //********************Quantization************************ //使得level的值合法
if (level <= && level >= )level = ;
else if(level < && level >= )level = ;
else if(level < && level >= )level = ;
else if(level < && level >= ) level = ;
else if(level < && level >= )level = ;
else if(level < && level >= )level = ;
else level = ; int channels = dst.channels();
int nrows = dst.rows;
int ncols = dst.cols * channels; uchar table[];
int degree = /(level - );
int number = / level;
int count = ;
int value = ; //设定好要求的灰度映射
for (int i = ; i < ; i ++, count ++) {
if (count < number) table[i] = value;
else {
count = ;
value += degree;
table[i] = value;
}
} if (src.isContinuous()) {
ncols *= nrows;
nrows = ;
} for (int i = ; i < nrows; i ++) {
uchar *p = dst.ptr<uchar>(i);
for (int j = ; j < ncols; j ++) {
p[j] = table[p[j]];
}
} //cout << level << " " << c << " " << r << "\n";
imshow("after change", dst);
} int main( int argc, char** argv) {
imshow("before change", image); int width = ;
int height = ;
int level = ;
namedWindow("after change", CV_WINDOW_AUTOSIZE);
createTrackbar( "Width", "after change", &width, , on_trackbar);
createTrackbar( "Height", "after change", &height, , on_trackbar);
createTrackbar( "Level", "after change", &level, , on_trackbar); //slider on_trackbar(, ); waitKey();
return ;
}

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

CMakeLists.txt

 cmake_minimum_required(VERSION 2.8)
project( my_hw1 )
find_package( OpenCV REQUIRED )
add_executable( my_hw1 my_hw1.cpp )
target_link_libraries( my_hw1 ${OpenCV_LIBS} )

CMakeLists.txt

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

cmake .

make

./my_hw1

就可以执行了~~

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

【OpenCV】像素操作的数字图像处理的更多相关文章

  1. OpenCV像素操作和图形绘制

    像素操作 #include<iostream> #include<opencv2/opencv.hpp> using namespace std; using namespac ...

  2. 数字图像处理笔记与体会(一)——matlab编程基础

    最近开始学习数字图像处理,使用matlab实现,下面我就来记录笔记和体会,一方面是给大家提供参考,另一方面是防止我忘记了. 复习一下: 1.数字图像是用一个数字矩阵来表示的,数字阵列中的每个数字,表示 ...

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

    数字图像处理作业的输入图像全部都是灰度图像,所以汇总一下自己遇到的问题答案. OCV的图像容器是Mat<typename>,可以用imread(filename)读取图像,filename ...

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

    Opencv中图像的遍历与像素操作 OpenCV中表示图像的数据结构是cv::Mat,Mat对象本质上是一个由数值组成的矩阵.矩阵的每一个元素代表一个像素,对于灰度图像,像素是由8位无符号数来表示(0 ...

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

    数字图像处理是一门集计算机科学.光学.数学.物理学等多学科的综合科学.随着计算机科学的发展,数字图像处理技术取得了巨大的进展,呈现出强大的生命力,已经在多种领域取得了大量的应用,推动了社会的发展.其中 ...

  6. opencv中对图像的像素操作

    1.对灰度图像的像素操作: #include<iostream> #include<opencv2/opencv.hpp> using namespace std; using ...

  7. python opencv:像素操作

    图片的像素 像素:组成图片的单位 RGB:颜色由 RGB三种颜色组成 颜色深度:对于8bit的颜色深度来说,它可以表示的颜色范围是 0 ~ 255,对于RGB图片来说,8位颜色深度可以表示 (2^8) ...

  8. OpenCV基础篇之像素操作对照度调节

    程序及分析 /* * FileName : contrast.cpp * Author : xiahouzuoxin @163.com * Version : v1.0 * Date : Tue 29 ...

  9. python数字图像处理(1):环境安装与配置

    一提到数字图像处理编程,可能大多数人就会想到matlab,但matlab也有自身的缺点: 1.不开源,价格贵 2.软件容量大.一般3G以上,高版本甚至达5G以上. 3.只能做研究,不易转化成软件. 因 ...

随机推荐

  1. jqury-validate表单验证

    首先需要引入插件:jquery.validate.js这个插件. 然后对需要验证的表单实现js: $("#add-firewalls-form").validate({ submi ...

  2. Java内存问题的一些见解

    在Java中,内存泄露和其它内存相关问题在性能和可扩展性方面表现的最为突出.我们有充分的理由去具体地讨论他们. Java内存模型--或者更确切的说垃圾回收器--已经攻克了很多内存问题. 然而同一时候, ...

  3. hbase shell经常使用命令

    hbase经常使用命令 /usr/local/cloud/hbase/bin/hbase shell 用shell来连接hbase exit 退出hbase shell version 查看hbase ...

  4. ASP.NET MVC Model之二模型绑定

    Asp.net mvc中的模型绑定,或许大家经常用,但是具体说他是怎么一回事,可能还是会有些陌生,那么,本文就带你理解模型绑定.为了理解模型绑定,本文会先给出其定义,然后对通过比,来得出使用模型绑定的 ...

  5. 2016/1/1 运算符 笔记整理 接2015/12/30 Java 语法

    ④运算符 1,赋值运算符:实现从右向左的赋值,符号= 2,算术运算符:符号 + - * / %(求余或求模),结果自动转成最大的                      类型,自动升级. 3, 比较 ...

  6. Linux在终端启动程序关闭终端不退出的方法

    一般情况下关闭终端时,那么在这个终端中启动的后台程序也会终止,要使终端关闭后,后台程序保持执行,使用这个指令: nohup 命令 & 如:nohup ./studio.sh & 网上其 ...

  7. sql加一个%号是什么意思

    sql%notfound 是异常SQL%ROWCOUNT SQL语句执行影响的行数SQL%FOUND SQL语句是否成功执行SQL%NOTFOUND SQL语句是否成功执行SQL%ISOPEN 游标是 ...

  8. JQuery 日期选择框

    一    jeDate日期控件,关于官方的文档请查看: http://www.jayui.com/jedate/ 1 引入js文件 <script type="text/javascr ...

  9. 三种解密 HTTPS 流量的方法介绍

    转载自:https://imququ.com/post/how-to-decrypt-https.html作者: Jerry Qu Web 安全是一项系统工程,任何细微疏忽都可能导致整个安全壁垒土崩瓦 ...

  10. Python中关键字global与nonlocal的区别

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/xCyansun/article/details/79672634终于下定决心学习Python了.既然 ...