之前几天捣鼓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. Mariadb 主从

    一 mariadb主从多用于网站架构,因为该主从的同步机制是异步的,数据的同步有一定延迟,也就是说有可能会造成数据的丢失,但是性能比较好,因此网站大多数用的是主从架构的数据库,读写分离必须基于主从架构 ...

  2. xib或者storyboard设置颜色偏问题(与代码设置颜色不一致)

    选中xib中的label,在右边栏的第三个标签页中第三项是User Defined Runtime Attributes 添加一个keyPath,keyPath值为layer.borderWidth, ...

  3. chosen.jquery.js 搜索框只能从头匹配的解决思路+方法

    chosen.jquery.js 搜索框只能从头匹配的解决思路+方法 心急者请直接看下方 总结 ,由于本问题未能找到直接答案,所以只能通过修改源码解决.故将修改源码思路贴出来供大家参考,在遇到其他改源 ...

  4. Python开发【第*篇】【Xpath与lxml类库】

    什么是XML XML 指可扩展标记语言(EXtensible Markup Language) XML 是一种标记语言,很类似 HTML XML 的设计宗旨是传输数据,而非显示数据 XML 的标签需要 ...

  5. leetcode第一刷_Search in Rotated Sorted Array

    旋转数组的查找问题.从头開始扫一遍.O(N)的复杂度,一般也能过,甚至先排序下面,再二分都能过.只是这道题的目的当然不在于此. 想一下旋转之后对我们的查找产生了什么影响.假设没旋转过,我们直接比較ta ...

  6. 2016/1/22 1, 1-100 放集合 特定对象移除 2,List集合和Set集合是否可以重复添加

    package shuzu; import java.awt.List; import java.util.*; public class ListIterator { public static v ...

  7. javascript学习---BOM

    1.top是顶级的框架,也就是浏览器窗口. 2.window.close()只能关闭window.open()打开的窗口. 3.firefox不支持修改状态栏,firefox3后强制始终在弹出窗口中显 ...

  8. USACO Section 1.2PROB Miking Cows

    贪心做过去,先对每个时间的左边点进行排序,然后乱搞,当然线段树也可以做 /* ID: jusonal1 PROG: milk2 LANG: C++ */ #include <iostream&g ...

  9. ASP.NET快速开发框架之工作流引擎

    大家好,啊!我小六六也有自己的博客了,今天我来跟大家分享下我的撸码心得,顺便吐槽下,我的坑爹上司.作为一名程序猿,我在系统开发方面也是“浸淫”了许久了!喔,不不不,是经营! 今天我就跟大家分享一下工作 ...

  10. 使用Advanced Installer14.3 简单打包windows窗体应用程序

    1.新建项目工程(我使用的是企业版) 2.完善产品细节 3.应用程序文件夹 a.自动同步文件夹(也可以右键添加文件或文件夹) b.新建卸载快捷方式 c.卸载清理 4.安装参数 5.媒介配置 6.生成或 ...