之前几天捣鼓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. android插件化-apkplug从宿主启动插件Activity-06

    插件是一个apk文件它存在自己的Activity界面和UI显示,本节将解说如何配置插件的启动Activity以及如何从宿主启动它. 一 配置插件apk的对外启动Activity (内部activity ...

  2. 三星手机root后开启调试模式

    背景说明:三星手机高版本的手机进行root后也无法安装xposed,无法开启debuggable,使用androistdio无法进行调试. 1 .连接ddms无法显示正在运行的进程. 2.安装mpro ...

  3. CSS设置元素居中的方法

    1.margin:0 auto; 2.body{text-align:center;} 3.position:absolute; left:50%; margin-left:-(宽/2);

  4. 解决Hibernate4执行update操作,不更新数据的问题

    后台封装java对象,使用hibernate4再带的update,执行不更新数据,不报错. 下面贴出解决方法: 失败的方法 hibernate自带update代码:(失效) Session sessi ...

  5. Codeforces Round #214 (Div. 2) C. Dima and Salad 背包

    C. Dima and Salad   Dima, Inna and Seryozha have gathered in a room. That's right, someone's got to ...

  6. 谈谈C++私有继承

    很多C++程序猿从来没用过私有继承来设计他的类.的确,假设是本该用私有继承的地方却用了公有继承.对程序的功能的实现并无影响. 但这样的误用是一种错位的描写叙述.会引起阅读者的误解,甚至会引起类的使用者 ...

  7. bzoj2709: [Violet 1]迷宫花园

    二分答案,spfa check就行了. gb题卡精度. #include<cstdio> #include<iostream> #include<cstring> ...

  8. 美国诚实签经验——中英文行程单、往返机票、用英语面试的申请者通过率>用中文面试的申请者的通过率、一直保持着微笑,看上去很自信,也很诚恳、户口簿带上最好

    在排队等待时据我的观察,用英语面试的申请者通过率>用中文面试的申请者的通过率.一家人申请通过率>单个人通过率:商务签证通过率>旅游签证通过率 一.    面签材料 1.    必备材 ...

  9. 【转载】7条便利的ViewState技巧

    32.Seven handy ViewState tips 32.7条便利的ViewState技巧 Every time I have to deal with a classic ASP.NET W ...

  10. Linux压缩命令(zip/gz/bz2/tar/tar.gz/tar.bz2)

    一.Linux的压缩格式 .zip . gz . bz2    .tar 1..zip格式(Linux和Windows是可以互传的) 压缩命令 语法:zip 文件名.zip 文件名  ------压缩 ...