感兴趣区域(ROI,region of interest),就是从图像中选择的一个图像区域,这个区域是图像分许所关注的重点,通过圈定这个区域,一边进一步的处理,而且使用ROI指定想读入的目标,可以减少处理时间,增加精度。
Rect::Rect(int x, int y, int width, int height);
/*******************************************************************
* x: 左上角x坐标
* y: 左上角y坐标
* width: 宽度
* height: 高度
*********************************************************************/
Mat roi= img(Rect(x, y, w, h));
参数是按照行和列进行划分的。
第一个range的两个参数分别是起点的row和终点的row。
第二个range的两个参数分别是起点的col和终点的col
Range::Range(int _start, int _end) ;
/*******************************************************************
* _start: 起点
* _end: 终点
*********************************************************************/
Mat roi= img(Range(x,xx),Range(y,yy));
封装了三个操作如下
Rect selectROI(InputArray img, bool showCrosshair = true, bool fromCenter = false);
/*******************************************************************
* img: 原图
* showCrosshair: 鼠标选框,是否显示十字线
* fromCenter: 是否以起始鼠标位置为中心
*********************************************************************/
//Rect rect= selectROI(img, false, false);
//1.显示img
//2.鼠标选择区域
//3.使用“空格”或“enter”来完成当前选择并开始一个新的选择,使用“esc”终止多个ROI选择过程
void selectROIs(const String& windowName, InputArray img,CV_OUT std::vector& boundingBoxes, bool showCrosshair = true, bool fromCenter = false);
#include
#include
#include
用一个矩阵和原图像作卷积操作,重新计算像素值,用数学术语讲,即我们自定义一个权重表
掩模矩阵
计算公式
掩膜操作可以提高图像对比度,对比度提高可以增加图像感官度、锐化,让看起来有点模糊的图像更清晰
注意:
①定义rows的时候,是img的rows-1--->防止越界(因为要访问next) 周围的四个像素
②定义cols的时候,是img的cols-1
③注意像素点ptr的函数的使用,获取像素数组
④saturate_cast
防止像素值越界
Mat mask = Mat::zeros(img.size(), img.type());
int dims = img.channels();
int rows = img.rows - 1;
int cols = (img.cols - 1) * dims;
for (int i = 1; i < rows; i++)
{
uchar* pre = img.ptr(i - 1);
uchar* cur = img.ptr(i);
uchar* next = img.ptr(i + 1);
uchar* output = mask.ptr(i);
for (int j = dims; j < cols; j++)
{
output[j] = saturate_cast(
5 * pre[j] - cur[j - dims] - cur[j + dims] - pre[j]- next[j]);
}
}
需要定义一个权重矩阵:具体定义方法见下,Mat_
(3,3)<<九个参数值
//定义掩膜矩阵
Mat dst;
Mat kernel = (Mat_(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
filter2D(img, dst, img.depth(), kernel);
/*******************************************************************
* img: 原图
* dst: 存储结果图
* img.depth(): 原图深度
* kernel: 掩膜矩阵
*********************************************************************/
filter2D和自己操作像素得到的结果差不多。嫌麻烦可以直接fliter2D
#include
#include