【OpenCV】像素操作的数字图像处理
之前几天捣鼓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】像素操作的数字图像处理的更多相关文章
- OpenCV像素操作和图形绘制
像素操作 #include<iostream> #include<opencv2/opencv.hpp> using namespace std; using namespac ...
- 数字图像处理笔记与体会(一)——matlab编程基础
最近开始学习数字图像处理,使用matlab实现,下面我就来记录笔记和体会,一方面是给大家提供参考,另一方面是防止我忘记了. 复习一下: 1.数字图像是用一个数字矩阵来表示的,数字阵列中的每个数字,表示 ...
- 数字图像处理作业使用OpenCV - 使用笔记
数字图像处理作业的输入图像全部都是灰度图像,所以汇总一下自己遇到的问题答案. OCV的图像容器是Mat<typename>,可以用imread(filename)读取图像,filename ...
- Opencv中图像的遍历与像素操作
Opencv中图像的遍历与像素操作 OpenCV中表示图像的数据结构是cv::Mat,Mat对象本质上是一个由数值组成的矩阵.矩阵的每一个元素代表一个像素,对于灰度图像,像素是由8位无符号数来表示(0 ...
- MATLAB数字图像处理(一)基础操作和傅立叶变换
数字图像处理是一门集计算机科学.光学.数学.物理学等多学科的综合科学.随着计算机科学的发展,数字图像处理技术取得了巨大的进展,呈现出强大的生命力,已经在多种领域取得了大量的应用,推动了社会的发展.其中 ...
- opencv中对图像的像素操作
1.对灰度图像的像素操作: #include<iostream> #include<opencv2/opencv.hpp> using namespace std; using ...
- python opencv:像素操作
图片的像素 像素:组成图片的单位 RGB:颜色由 RGB三种颜色组成 颜色深度:对于8bit的颜色深度来说,它可以表示的颜色范围是 0 ~ 255,对于RGB图片来说,8位颜色深度可以表示 (2^8) ...
- OpenCV基础篇之像素操作对照度调节
程序及分析 /* * FileName : contrast.cpp * Author : xiahouzuoxin @163.com * Version : v1.0 * Date : Tue 29 ...
- python数字图像处理(1):环境安装与配置
一提到数字图像处理编程,可能大多数人就会想到matlab,但matlab也有自身的缺点: 1.不开源,价格贵 2.软件容量大.一般3G以上,高版本甚至达5G以上. 3.只能做研究,不易转化成软件. 因 ...
随机推荐
- Windows网络编程:winsock文件传输范例
基于TCP流协议的winsock网络文件传输Demo: 实现:C语言 功能:文件传输(可以传任何格式的文件) /******************************************** ...
- APP漏洞自动化扫描专业评测报告
一.前言 目前在业界有很多自动化检测APP安全性的在线扫描平台.为了了解目前国内移动APP在线漏洞扫描平台的发展情况,我进行了一次移动安全扫描平台的评测分析:主要从漏洞项对比.扫描能力对比以及扫描结果 ...
- Cookies 初识 Dotnetspider EF 6.x、EF Core实现dynamic动态查询和EF Core注入多个上下文实例池你知道有什么问题? EntityFramework Core 运行dotnet ef命令迁移背后本质是什么?(EF Core迁移原理)
Cookies 1.创建HttpCookies Cookie=new HttpCookies("CookieName");2.添加内容Cookie.Values.Add(&qu ...
- cocos2d-x 求相交矩阵
cocos2d-x有推断矩阵相交的方法 CCRect::intersectsRect(CCRect& rect)但可惜没有提供求两个相交矩阵的方法,我作了总结,代码例如以下: CCRect T ...
- MySQL-查询数据(SELECT)
MySQL SELECT语句 SELECT语句用于从表或视图中获取数据 Select语句组成 Select 之后是逗号分隔列或星号(*)的列表,表示要返回所有列. From 指定要查询数据的表或视图. ...
- Deferred Rendering(二)G-Buffer的组织
先来看一张网上广为流传的<杀戮地带2>典型的Deferred Shading的G-Buffer组织: 这里补充解释下几个点: 不存Position,而由depth和屏幕像素坐标反推出来.參 ...
- Dll,OCX控件的注册(转)
原文地址:http://home.51.com/heiyijiushi/diary/item/10053693.html C#自动实现Dll(OCX)控件注册的两种方法2012-07-31 21:20 ...
- 【HNOI模拟By YMD】move
Description 设P(n)为从(0,0)移动到点(n,0)的不同路径数目,移动的方式有以下三种:(x,y)->(x+1,y-1),(x,y)->(x+1,y),(x+y)-> ...
- HTTP要点概述:五,HTTP的无状态性,持久连接,Cookie
一,HTTP的无状态性: HTTP 是一种不保存状态,无状态(stateless)协议.HTTP 协议自身不对请求和响应之间的通信状态进行保存.也就是说在 HTTP 这个级别,协议对于发送过的请求或响 ...
- ubuntu-10.10嵌入式开发环境搭建【转】
本文转载自:http://blog.csdn.net/zjhsucceed_329/article/details/8036781 版权声明:本文为博主原创文章,未经博主允许不得转载. ubuntu- ...