2016-05-28 21:26:11 haifengid 阅读数 951
  • OpenCV4 图像处理与视频分析实战教程

    基于OpenCV最新版本OpenCV4开始,从基础开始,详解OpenCV核心模块Core、Imgproc、video analysis核心API 与相关知识点,讲解从图像组成,像素操作开始,一步一步教你如何写代码,如何用API解决实际问题,从图像处理到视频分析,涵盖了计算机视觉与OpenCV4 中主要模块的相关知识点,穿插大量工程编程技巧与知识点与案例,全部课程的PPT课件与源码均可以下载。部分课程内容运行截图:

    1683 人正在学习 去看看 贾志刚
 
图像处理基础:冈萨雷斯的数字图像处理
图像中的目标更好的识别
模式识别相关理论‘机器学习、计算机视觉。这些都是交叉的学科
数学基础:高数(基础),概率论(比如高斯分布,马尔科夫,贝叶斯用的超多。每个像素点都可以看做是个样本。等等),线性代数、矩阵论、信号与系统(傅氏变换,需要变换到频域进行分析。

相关论文都是这方面的东西。比如pca这个很经典的东西,就是线代的。

如果要搞机器视觉还要看一些成像
 

2019-05-28 21:58:23 weixin_43559676 阅读数 49
  • OpenCV4 图像处理与视频分析实战教程

    基于OpenCV最新版本OpenCV4开始,从基础开始,详解OpenCV核心模块Core、Imgproc、video analysis核心API 与相关知识点,讲解从图像组成,像素操作开始,一步一步教你如何写代码,如何用API解决实际问题,从图像处理到视频分析,涵盖了计算机视觉与OpenCV4 中主要模块的相关知识点,穿插大量工程编程技巧与知识点与案例,全部课程的PPT课件与源码均可以下载。部分课程内容运行截图:

    1683 人正在学习 去看看 贾志刚

数字图像处理基础知识

随计算机技术的发展,20世纪50年代,人们应用计算机处理一些图形和图像信息,这是最早的图像处理;20世纪60年代,人们应用计算机改善图像的质量,这时形成了数字图像处理这门学科。本章主要介绍数字图像处理的基础内容,包括什么是数字图像基础、图像的表示方法、图像的数据结构以及计算机中图像文件格式。

一 数字图像处理简介
数字图像处理(Digital Image Processing)是一种将图像信号数字化后利用计算进行处理的技术。随着计算机科学的发展,数字图像处理已经广泛的应用到各领域之中。
图像的概念
图像就是将三维世界中的事物投影到二维平面上,变为一张图片的形式。图像中包含了它所表达的事物的大部分信息,据有关资料表示,人类所获得的大部分信息来源于眼睛,也就是从图像中获得的。
数字图像的分类
数字图像在计算机中表示方法不同,分为二进制图像,索引图像,灰度图像,RGB图像和多帧图像;
数字图像的产生
数字图像的产生主要通过两种方式,一种是通过像数码照相机这样的设备直接拍摄得到数字图像,还有一种是通过图像采集卡、扫描仪等数字化设备,将模拟图像转变为数字图像。
1.1.4数字图像处理的研究内容
1) 图像运算与变换
2) 图像增强
3) 图像复原
4).图像的锐化处理及边缘检测
5) 图像分割
6) 图像编码压缩
图像的表示方法
图像的表示方法是对图像处理算法描述和利用计算机处理图像的基础。一个二维图像,在计算机中通常为一个二维数组f (x, y),或者是一个M×N的二维矩阵(其中,M为图像的行数,N为图像的列数)
1 二进制图像
二进制图像也称为二值图像,通常用一个二维数组来描述,1位表示一个像素,组成图像的像素值非0即1,没有中间值,通常0表示黑色,1表示白色。二进制图像一般用来描述文字或者图形,其优点是占用空间少方便处理,缺点是只能描述边缘轮廓等无法显示其细节。
2 灰度图像
灰度图像也称为单色图像,通常也由一个二维数组表示一副图像,8位表示一个像素,0表示黑色,255表示白色,1~254表示不同的深浅灰色,一副灰度图像放大4×4大小像素,通常灰度图像显示了黑色与白色之间许多级的颜色深度,比人眼所能识别的颜色深度范围要宽的多。
3 RGB图像
RGB图像也称为彩色图像,利用3个大小相同的二维数组表示一个像素,3个数组分别代表R、G、B三个分量,R表示红色,G表示绿色,B表示蓝色,通过三种基本颜色可以合成任意颜色。每个像素中的每种颜色分量占8位,每一位由[0,255]中的任意数值表示,那么一个像素由24位表示,允许的最大值为224(即1677216,通常记为16M)。
4 索引图像
索引图像是一种把像素值直接作为RGB调色板下标的图像。在MATLAB中,索引图像包含一个数据矩阵X和一个颜色映射(调色板)矩阵map。数据矩阵可以是8位无符号整型、16位无符号整型或双精度类型的。
5 多帧图像
多帧图像是一种包含多幅图像或帧的图像文件,又称为多页图像或图像序列,主要用于需要对时间或场景上相关图像集合进行操作的场合。例如,计算机X线断层扫描图像或电影帧等
矩阵
矩阵用于描述图像,可以表示黑白图像、灰度图像和彩色图像。矩阵中的一个元素表示图像的一个像素。矩阵描述黑白图像时,矩阵中的元素取值只有0和1两个值,因此黑白图像又叫二值图像或二进制图像。矩阵描述灰度图像时,矩阵中的元素由一个量化的灰度级描述,灰度级通常为8位,即0~255之间的整数,其中0表示黑色,255表示白色。
二 计算机中图像文件格式
数字图像在计算机中存储的格式有多种多样,每一种文件格式都包括一个头文件和一个数据文件。头文件的内容由制作图像的公司规定,一般包括文件类型、制作时间,文件大小制作人及版本号等信息。文件制作时还涉及到图像的压缩和存储效率等。
BMP文件格式
BMP文件格式是Windows系统中的一种标准图像文件格式,支持 RGB、索引颜色、灰度和位图颜色模式。BMP文件一共有两种类型,设备相关位图(DDB)和设备无关位图(DIB)。Windows3.0以前的BMP文件格式与显示设备有关,因此把这种BMP文件格式称为设备相关位图DDB(device-dependent bitmap)文件格式。Windows 3.0以后的BMP文件与显示设备无关,因此把这种BMP图象文件格式称为设备无关位图DIB(device-independent bitmap)格式。BMP文件默认的文件扩展名是 .BMP或 .bmp。
GIF文件格式
GIF文件格式是CompuServe公司在 1987年开发的图像文件格式,任何商业目的使用均须由CompuServe公司授权。GIF文件主要是为数据流设计的一种传输格式,不作为文件的存储格式,它具有顺序的结构形式。GIF文件主要由五部分组成:文件标志块,识别标识符“GIF”和版本号;逻辑屏幕描述块,定义图像显示区域的参数,包含背景颜色信息、显示区域大小、纵横
尺寸、颜色深浅以及是否存在全局彩色表;全局彩色表,其大小由图像使用的颜色数决定;图像数据块,包含图像的描述块,局部彩色表,压缩图像数据,图像控制扩展块,无格式文本扩展块,注释扩展块,应用程序扩展块,此部分可以缺省;尾块,为三维16进制数,表示数据流已经结束,此部分可以缺省。
JPEG文件格式
JPEG是Joint Photographic Experts Group的缩写,即联合国图像专家组。作为一种图像文件格式,JPEG格式联合国图像专家组制定,文件扩展名 .jpg或 .jpeg。JPEG格式的图像文件具有迄今为止最为复杂的文件结构和编码方式,和其他格式的最大区别是JPEG使用一种有损压缩算法,是以牺牲一部分的图像数据来达到较高的压缩率,但是这种损失很小以至于很难察觉。JPEG格式又可分为标准JPEG、渐进式JPEG及JPEG2000三种格式,这三种格式的区别主要在Internet图像显示方式上。标准JPEG格式图像在网页下载时只能由上而下依序显示图像,直到图像全部下载完毕,才能看到全貌。渐进式JPEG格式可以在网页下载时,先呈现出图像的粗略外观后,再慢慢地呈现出完整的内容。JPEG2000格式是新一代的影像压缩法,压缩品质更好,并可改善无线传输时,常因讯号不稳造成马赛克及位置错乱的情况,改善传输的品质。
TIFF文件格式
TIFF格式最初由Aldus公司与微软公司一起为PostScript打印开发,是一种主要用来存储包括照片和艺术图在内的图像的文件格式,文件扩展名为 .tif 或 .tiff。TIFF文件格式主要包括三个部分:文件头,有固定的位置,位于文件的最前端,是文件中惟一的,包含一个标志参数指出标识信息区在文件中的存储地址及正确解释TIFF文件的其他部分所需的必要信息; 标识信息区,是用于区分一个或多个可变长度数据块的表,包含了有关于图像的所有信息。图像文件目录中提供了一系列的指针,这些指针指向各种有关的数据字段在文件中的初始地址,并给出每个字段的数据类型及长度;图像数据,根据图像文件目录所指向的地址存储相关的图像信息。

2017-01-26 20:40:32 clover_daisy 阅读数 924
  • OpenCV4 图像处理与视频分析实战教程

    基于OpenCV最新版本OpenCV4开始,从基础开始,详解OpenCV核心模块Core、Imgproc、video analysis核心API 与相关知识点,讲解从图像组成,像素操作开始,一步一步教你如何写代码,如何用API解决实际问题,从图像处理到视频分析,涵盖了计算机视觉与OpenCV4 中主要模块的相关知识点,穿插大量工程编程技巧与知识点与案例,全部课程的PPT课件与源码均可以下载。部分课程内容运行截图:

    1683 人正在学习 去看看 贾志刚

图片操作:载入,保存,展示

  • 准备工作:下载一张图片picture.jpg

import numpy as np
import cv2

#查看cv2的版本
print(cv2.__version__)
#读取图片信息,展示图片
img = cv2.imread('./picture.jpg')
print(img)
print(img.shape)
cv2.imshow('img_show',img)
#输入任意键退出显示图片的窗口
key = cv2.waitKey(0)&0xff
print(key)
#将图片变为单色,并保存
img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
print(img.shape)
cv2.imwrite('picture1.jpg',img)
#释放资源,与imshow()方法对应
cv2.destroyAllWindows()
  • picture.jpg
    这里写图片描述
  • picture1.jpg

这里写图片描述

OpenCV绘图

  • 准备工作:下载一张背景图片background.jpg
import numpy as np
import cv2

img = cv2.imread('./background.jpg')
print(img)
print(img.shape)
#直线
img = cv2.line(img,(0,0),(1280,0),(255,0,155),15)
img = cv2.line(img,(0,0),(0,800),(255,0,155),15)
img = cv2.line(img,(1280,0),(1280,800),(255,0,155),15)
img = cv2.line(img,(0,800),(1280,800),(255,0,155),15)
img = cv2.line(img,(100,100),(250,250),(255,255,255),3)
img = cv2.line(img,(250,100),(100,250),(255,255,255),3)
#矩形
img = cv2.rectangle(img,(100,100),(250,250),(0,255,255),3)
#圆形
img = cv2.circle(img,(175,175),110,(255,255,0),3)

cv2.imshow('img_show',img)
key = cv2.waitKey(0)&0xff
print(key)
cv2.destroyAllWindows()
  • 绘图后的结果:
    这里写图片描述

OpenCV文字处理

  • 准备工作:下载一张背景图片background.jpg
import numpy as np
import cv2

img = cv2.imread('./background.jpg')
print(img)
print(img.shape)

'''
#直线
img = cv2.line(img,(0,0),(1280,0),(255,0,155),15)
img = cv2.line(img,(0,0),(0,800),(255,0,155),15)
img = cv2.line(img,(1280,0),(1280,800),(255,0,155),15)
img = cv2.line(img,(0,800),(1280,800),(255,0,155),15)
img = cv2.line(img,(100,100),(250,250),(255,255,255),3)
img = cv2.line(img,(250,100),(100,250),(255,255,255),3)
#矩形
img = cv2.rectangle(img,(100,100),(250,250),(0,255,255),3)
#圆形
img = cv2.circle(img,(175,175),110,(255,255,0),3)

'''

font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img,'Never frown',(750,150),font,1.5,(255,255,255),5,cv2.LINE_AA)
cv2.putText(img,'even when you are sad ',(625,250),font,1.5,(255,255,255),5,cv2.LINE_AA)
cv2.putText(img,'because you never know ',(500,350),font,1.5,(255,255,255),5,cv2.LINE_AA)
cv2.putText(img,'who is falling in love with your smile ',(390,450),font,1.5,(255,255,255),5,cv2.LINE_AA)



cv2.imshow('img_show',img)
key = cv2.waitKey(0)&0xff
print(key)
cv2.destroyAllWindows()
  • 文字处理结果
    这里写图片描述

  • 原始图片background.jpg
    这里写图片描述

  • 文字+绘图后的结果:
    这里写图片描述
2018-08-16 22:54:17 Eastmount 阅读数 9815
  • OpenCV4 图像处理与视频分析实战教程

    基于OpenCV最新版本OpenCV4开始,从基础开始,详解OpenCV核心模块Core、Imgproc、video analysis核心API 与相关知识点,讲解从图像组成,像素操作开始,一步一步教你如何写代码,如何用API解决实际问题,从图像处理到视频分析,涵盖了计算机视觉与OpenCV4 中主要模块的相关知识点,穿插大量工程编程技巧与知识点与案例,全部课程的PPT课件与源码均可以下载。部分课程内容运行截图:

    1683 人正在学习 去看看 贾志刚

该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子、图像增强技术、图像分割等,后期结合深度学习研究图像识别、图像分类应用。希望文章对您有所帮助,如果有不足之处,还请海涵~

该系列在github所有源代码:https://github.com/eastmountyxz/ImageProcessing-Python
PS:请求帮忙点个Star,哈哈,第一次使用Github,以后会分享更多代码,一起加油。

同时推荐作者的C++图像系列知识:
[数字图像处理] 一.MFC详解显示BMP格式图片
[数字图像处理] 二.MFC单文档分割窗口显示图片
[数字图像处理] 三.MFC实现图像灰度、采样和量化功能详解
[数字图像处理] 四.MFC对话框绘制灰度直方图
[数字图像处理] 五.MFC图像点运算之灰度线性变化、灰度非线性变化、阈值化和均衡化处理详解
[数字图像处理] 六.MFC空间几何变换之图像平移、镜像、旋转、缩放详解
[数字图像处理] 七.MFC图像增强之图像普通平滑、高斯平滑、Laplacian、Sobel、Prewitt锐化详解

本篇文章作为第一篇,将讲解图像处理基础知识和OpenCV入门函数,知识点如下:
1.图像基础知识
2.OpenCV读写图像
3.OpenCV像素处理

PS: 文章也学习了网易云高登教育的知识,推荐大家学习。

PSS:2019年1~2月作者参加了CSDN2018年博客评选,希望您能投出宝贵的一票。我是59号,Eastmount,杨秀璋。投票地址:https://bss.csdn.net/m/topic/blog_star2018/index

五年来写了314篇博客,12个专栏,是真的热爱分享,热爱CSDN这个平台,也想帮助更多的人,专栏包括Python、数据挖掘、网络爬虫、图像处理、C#、Android等。现在也当了两年老师,更是觉得有义务教好每一个学生,让贵州学子好好写点代码,学点技术,"师者,传到授业解惑也",提前祝大家新年快乐。2019我们携手共进,为爱而生。

一.图像基础知识

图像都是由像素(pixel)构成的,即图像中的小方格,这些小方格都有一个明确的位置和被分配的色彩数值,而这些一小方格的颜色和位置就决定该图像所呈现出来的样子。像素是图像中的最小单位,每一个点阵图像包含了一定量的像素,这些像素决定图像在屏幕上所呈现的大小。

图像通常包括二值图像、灰度图像和彩色图像。

1.二值图像
二值图像中任何一个点非黑即白,要么为白色(像素为255),要么为黑色(像素为0)。将灰度图像转换为二值图像的过程,常通过依次遍历判断实现,如果像素>=127则设置为255,否则设置为0。

2.灰度图像
灰度图像除了黑和白,还有灰色,它把灰度划分为256个不同的颜色,图像看着也更为清晰。将彩色图像转换为灰度图是图像处理的最基本预处理操作,通常包括下面几种方法:
(1) 浮点算法:Gray=R0.3+G0.59+B0.11
(2) 整数方法:Gray=(R
30+G59+B11)/100
(3) 移位方法:Gray=(R28+G151+B77)>>8;
(4) 平均值法:Gray=(R+G+B)/3;(此程序采用算法)
(5) 仅取绿色:Gray=G;
(6) 加权平均值算法:根据光的亮度特性,公式: R=G=B=R
0.299+G*0.587+B0.144

通过上述任一种方法求得Gray后,将原来的RGB(R,G,B)中的R,G,B统一用Gray替换,形成新的颜色RGB(Gray,Gray,Gray),用它替换原来的RGB(R,G,B)就是灰度图了。改变象素矩阵的RGB值,来达到彩色图转变为灰度图。

3.彩色图像
彩色图像是RGB图像,RGB表示红、绿、蓝三原色,计算机里所有颜色都是三原色不同比例组成的,即三色通道。



二.OpenCV读写图像

本文主要使用Python2.7和OpenCV进行讲解,首先调用"pip install opencv-python"安装OpenCV库,如下图所示:

1.读入图像
OpenCV读图像主要调用下面函数实现:

img = cv2.imread(文件名,[,参数])
参数(1) cv2.IMREAD_UNCHANGED (图像不可变)
参数(2) cv2.IMREAD_GRAYSCALE (灰度图像)
参数(3) cv2.IMREAD_COLOR (读入彩色图像)
参数(4) cv2.COLOR_BGR2RGB (图像通道BGR转成RGB)

2.显示图像
显示图像调用函数如下:

cv2.imshow(窗口名, 图像名)

3.窗口等待
调用函数如下:

cv2.waitKey(delay)
键盘绑定函数,共一个参数,表示等待毫秒数,将等待特定的几毫秒,看键盘是否有输入,返回值为ASCII值。如果其参数为0,则表示无限期的等待键盘输入;参数>0表示等待delay毫秒;参数<0表示等待键盘单击。

4.删除所有窗口
调用函数如下:

cv2.destroyAllWindows() 删除所有窗口
cv2.destroyWindows() 删除指定的窗口

5.写入图片
调用函数如下:

retval = cv2.imwrite(文件地址, 文件名)

下面代码是读入图片并显示保存。

# -*- coding:utf-8 -*-
import cv2

#读取图片
img = cv2.imread("test.jpg")

#显示图像
cv2.imshow("Demo", img)

#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

#写入图像
cv2.imwrite("testyxz.jpg", img)

输出结果如下图所示,并且在文件夹下保存了一张名为“testyxz.jpg”的图像。

如果代码中没有watiKey(0)函数,则运行结果如下图所示:

同时
可以对代码进行升级,如下所示:

#无限期等待输入
k=cv2.waitKey(0)
#如果输入ESC退出
if k==27:
    cv2.destroyAllWindows()


三.OpenCV像素处理

1.读取像素
灰度图像直接返回灰度值,彩色图像则返回B、G、R三个分量。注意OpenCV读取图像是BGR存储显示,需要转换为RGB再进行图像处理。

灰度图像:返回值 = 图像(位置参数)
eg: test=img[88,42]
彩色图像:返回值 = 图像[位置元素, 0 | 1 | 2 ] 获取BGR三个通道像素
eg: blue=img[88,142,0] green=img[88,142,1] red=img[88,142,2]

2.修改图像
修改图像如果是灰度图像则直接赋值新像素即可,彩色图像依次给三个值赋值即可。

灰度图像:
img[88,142] = 255
彩色图像:
img[88,142, 0] = 255
img[88,142, 1] = 255
img[88,142, 2] = 255
彩色图像:方法二
img[88,142] = [255, 255, 255]

下面代码是获取像素及修改的操作。

# -*- coding:utf-8 -*-
import cv2

#读取图片
img = cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED)
test = img[88,142]
print test
img[88,142] = [255, 255, 255]
print test

#分别获取BGR通道像素
blue = img[88,142,0]
print blue
green = img[88,142,1]
print green
red = img[88,142,2]
print red

#显示图像
cv2.imshow("Demo", img)

#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

#写入图像
cv2.imwrite("testyxz.jpg", img)

输出结果如下所示:
[158 107 64]
[255 255 255]
255
255
255

下面代码是将行为100到200、列150到250的像素区域设置为白色。

# -*- coding:utf-8 -*-
import cv2

#读取图片
img = cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED)

#该区域设置为白色
img[100:200, 150:250] = [255,255,255]

#显示图像
cv2.imshow("Demo", img)

#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

#写入图像
cv2.imwrite("testyxz.jpg", img)

运行结果如下图所示:

希望文章对大家有所帮助,如果有错误或不足之处,还请海涵。
(By:Eastmount 2018-08-16 夜11点 https://blog.csdn.net/Eastmount/

2017-05-22 17:08:53 wujiahui1207 阅读数 467
  • OpenCV4 图像处理与视频分析实战教程

    基于OpenCV最新版本OpenCV4开始,从基础开始,详解OpenCV核心模块Core、Imgproc、video analysis核心API 与相关知识点,讲解从图像组成,像素操作开始,一步一步教你如何写代码,如何用API解决实际问题,从图像处理到视频分析,涵盖了计算机视觉与OpenCV4 中主要模块的相关知识点,穿插大量工程编程技巧与知识点与案例,全部课程的PPT课件与源码均可以下载。部分课程内容运行截图:

    1683 人正在学习 去看看 贾志刚

OpenCV中程序的模板

#include <iostream>
#include"opencv2/opencv.hpp"
using namespace std;
using namespace cv;

在OpenCV中,灰度图像的存储示意图

这里写图片描述

彩色图像的存储示意图,在OpenCV中彩色图像的颜色存储顺序为蓝,绿,红(BGR)

这里写图片描述

Mat常用的构造函数

Mat::Mat()
Mat::Mat(int rows, int cols, int type)
Mat::Mat(Size size, int type)
Mat::Mat(int rows, int cols, int type, const Scalar& s)
Mat::Mat(Size size, int type, const Scalar& s)
Mat::Mat(const Mat& m)
Mat::Mat(int rows, int cols, int type, void* data, size_t step=AUTO_STEP)
Mat::Mat(Size size, int type, void* data, size_t step=AUTO_STEP)
Mat::Mat(const Mat& m, const Range& rowRange, const Range& colRange)
Mat::Mat(const Mat& m, const Rect& roi)
//构造函数创建图像
Mat M(2,2,CV_8UC3);
//释放内存重新创建图像
M.create(3,2,CV_8UC2);

OpenCV深拷贝和浅拷贝的问题

这里写图片描述

遍历图像(几种像素值得读写)
方法1

//灰度图像
uchar value=grayim.at<uchar>(i,j);
for(int i=0;igrayim.rows;++i)
   for(int j=0;j<grayim.cols;++j)
      grayim.at<uchar>(i,j)=(i+j)%255;
//彩色图像
for(int i=0;i<colorim.rows;++i)
   for(int j=0;j<colorim.cols;++j)
   {
      Vec3b pixel;
      pixel[0]=i%255;  //Blue
      pixel[1]=j%255;  //Green
      pixel[2]=0;  //Red
      colorim.at<Vec3b>(i,j)=pixel;
   }

这里写图片描述

方法2(迭代器)

//灰度图像
cv::Mat Iterator_<uchar> grayit, grayend;
for( grayit = grayim.begin<uchar>(), grayend = grayim.end<uchar>(); grayit != grayend; ++grayit)
    *grayit = rand()%255;
//彩色图像
cv::Mat Iterator_<Vec3b> colorit,colorend;
for(colorit=colorim.begin<Vec3b>(),colorend=colorim.end<Vec3b>();colorit!=colorend;++colorit)
{
    (*colorit)[0]=rand()%255;  //Blue
    (*colorit)[1]=rand()%255;  //Green
    (*colorit)[2]=rand()%255;  //Red
}

方法3

for( int i = 0; i < grayim.rows; ++i)
{
    //获取第 i 行首像素指针
    uchar * p = grayim.ptr<uchar>(i);
    //对第 i 行的每个像素(byte)操作
    for( int j = 0; j < grayim.cols; ++j )
         p[j] = (i+j)%255;
}

方法4(step)
二维数据

这里写图片描述

三维数据

这里写图片描述

addr(Mi0,i1,…im-1) = M.data + M.step[0] * i0 + M.step[1] * i1 + … +M.step[m-1] * im-1 (其中 m = M.dims M的维度)

int main()
{
    //新建一个uchar类型的单通道矩阵(grayscale image 灰度图)
    Mat m(400, 400, CV_8U, Scalar(0));
    for (int col = 0; col < 400; col++)
    {
        for (int row = 195; row < 205; row++)
        {
            cout << (int)(*(m.data + m.step[0] * row + m.step[1] * col)) << "==>";
            //获取第[row,col]个像素点的地址并用*符号解析
            *(m.data + m.step[0] * row + m.step[1] * col) = 255;
            cout << (int)(*(m.data + m.step[0] * row + m.step[1] * col)) << endl;
        }
    }
    imshow("binary image", m);
    cvWaitKey();
    return 0;
}

上述代码结果图

int main()
{
    Mat m = imread("lena.jpg");
    Vec3i color;
    for (int col = 20; col < 40; col++)
        for (int row = 5; row < 25; row++)
        {
            color[0] = (int)(*(m.data + m.step[0] * row + m.step[1] * col));
            color[1] = (int)(*(m.data + m.step[0] * row + m.step[1] * col + m.elemSize1()));
            color[2] = (int)(*(m.data + m.step[0] * row + m.step[1] * col + m.elemSize1() * 2));
            //获取第[row,col]个像素点的地址并用*符号解析
            cout << color[0] << "," << color[1] << "," << color[2] << "==>";
            color[0] = 255;
            color[1] = 0;
            color[2] = 0;
            *(m.data + m.step[0] * row + m.step[1] * col) = color[0];
            *(m.data + m.step[0] * row + m.step[1] * col + m.elemSize1()) = color[1];
            *(m.data + m.step[0] * row + m.step[1] * col + m.elemSize1() * 2) = color[2];
            cout << (int)*(m.data + m.step[0] * row + m.step[1] * col) <<
                (int)*(m.data + m.step[0] * row + m.step[1] * col + 1) <<
                (int)*(m.data + m.step[0] * row + m.step[1] * col + 2) << endl;
        }
    imshow("lena", m);
    cvWaitKey();
    return 0;
}

上述代码结果图

方法5(Mat_类)

Mat M(600, 800, CV_8UC1);
for (int i = 0; i < M.rows; ++i)
{
    uchar * p = M.ptr<uchar>(i);
    for (int j = 0; j < M.cols; ++j)
    {
        double d1 = (double)((i + j) % 255);
        M.at<uchar>(i, j) = d1;
        double d2 = M.at<double>(i, j);
    }
}
Mat_<uchar> M1 = (Mat_<uchar>&)M;
for (int i = 0; i < M1.rows; ++i)
{
    uchar * p = M1.ptr(i);
    for (int j = 0; j < M1.cols; ++j)
    {
        double d1 = (double)((i + j) % 255);
        M1(i, j) = d1;
        double d2 = M1(i, j);
    }
}
int main()
{
Mat m = imread("lena.jpg");
    Mat_<Vec3b>m2 = m;
    //for循环画一个蓝色的实心圆
    for (int y = 21; y < 42; y++)
        for (int x = 2; x < 21; x++)
        {
            if (pow(double(x - 11), 2) + pow(double(y - 31), 2) - 64 < 0.0000000001)
            {
                //Mat_模板类实现了对()的重载,可以定位到一个像素
                m2(x, y) = Vec3b(255, 0, 0);
            }
        }
    imshow("CircleImage", m2);
    cvWaitKey();
    return 0;
}

这里写图片描述

方法6

int divideWith=10;
uchar table[256];
for (int i = 0; i < 256; ++i)
    table[i] = divideWith* (i/divideWith); //量化
Mat lookUpTable(1, 256, CV_8U);
uchar* p = lookUpTable.data;
for( int i = 0; i < 256; ++i)
    p[i] = table[i];
LUT(I, lookUpTable, Out);

学习OpenCV必备资料

这里写图片描述

手册:http://docs.opencv.org/
教程:http://docs.opencv.org/2.4/doc/tutorials/tutorials.html
进阶:http://github.com/opencv/opencv/wiki
在OpenCV安装目录下build->doc->opencv_tutorials.pdf 为学习教程

数字图像处理的基础

博文 来自: qq_41375318
没有更多推荐了,返回首页