之前几天捣鼓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. 手游产品经理初探(二)从营销角度看loading界面

    近期開始写产品相关的专题,准备从细节入手去思考.总结一些不为人注意的细节地方. 今天给大家分享的是游戏里面都有的loading界面. 还是从几个在Facebook上排名靠前的Casino游戏的load ...

  2. _DataStructure_C_Impl:图的遍历

    #include<stdio.h> #include<stdlib.h> #include<string.h> //图的邻接表类型定义 typedef char V ...

  3. AVD那些事儿

    启动了AVD却说找不到AVD 错误提示: No active compatible AVD's or devices found. Relaunch this configuration after ...

  4. Android学习笔记-获取手机内存,SD卡存储空间。

    前面介绍到如何保存数据到手机内存或者SD卡,但是问题是,在保存以前,我们还需要对他们的空间(可用空间),进行判断,才可以进行后续操作,所以,本节我们就介绍如何获取手机内存以及Sd卡的空间. //这时获 ...

  5. NSSet所有API学习。

    /****************集合(NSSet)和数组(NSArray)有相似之处,都是存储不同的对象的地址.只是NSArray是有序的集合,NSSet是无序的集合,同一时候NSSet能够保证数据 ...

  6. selenium iframe 定位 qq空间说说

    selenium iframe 定位  qq空间说说

  7. Struts数据验证

    Action类继承了ActionSupport类,而该类实现了Action.Validateable.ValidationAware.TextProvider.LocaleProvider和Seria ...

  8. c# IP从192.168.1.1转成int类型

    找了一些资料,总结如下: 方法1 .net提供的方法转换IP地址 //字符串转换为数字 System.Net.IPAddress ipaddress = System.Net.IPAddress.Pa ...

  9. hdoj--2186--悼念512汶川大地震遇难同胞——一定要记住我爱你(模拟水题)

     悼念512汶川大地震遇难同胞--一定要记住我爱你 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (J ...

  10. luogu 3953 逛公园

    noip2017 D1T3 逛公园 某zz选手看到数据范围直接就最短路计数了,结果写错了爆零 题目大意: N个点M条边构成的有向图,且没有自环和重边.其中1号点是起点,N号点是公园的终点,每条边有一个 ...