2019-03-22 17:55:39 weixin_42183170 阅读数 1437
  • 软件测试入门视频教程

    软件测试入门视频培训教程:该课程将带你走进“软件测试”的大门,具体内容包括软件测试环境搭建、软件开发模型、产品模型、CMM模型、测试用例、等价类划分、边界值划分、白盒测试、单元测试、bugfree搭建、系统测试、回归测试、验收测试等。本课程以接地气的语言来讲解,让你听的懂,学的会!本课程以全新的方式为你呈现教学内容,清新脱俗独具特色的授课方式将带给你新的体验。

    2158781 人正在学习 去看看 李晓鹏

空间滤波的工作原理

滤波器的邻域中心访问输入图像中的每一个像素,并产生一个对应的信像素,新像素的坐标等于当前访问的像素的坐标,新像素的值是预定义操作的运算结果。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
以此类推。

一,图像边界处理方法

1 忽略边界数据
2.拓展图像(四周补上数据)

  • 使用P值填充(如:P=0)
  • 复制图像边界像素的值
  • 镜像图像边界像素的值
  • 周期扩展

1. 忽略边界数据
在这里插入图片描述
优点:滤波后的图像中所有像素点都能由整个模版处理
缺点:处理后的图像比原始图像小,输出的图像尺寸=n-w+1
2. 拓展图像(四周补上数据)
在这里插入图片描述
(1) 使用P=0来填充
在这里插入图片描述
在这里插入图片描述
(2) 复制图像边界
在这里插入图片描述
在这里插入图片描述
(3)镜像扩展
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(4)周期扩展
在这里插入图片描述
在这里插入图片描述
优点:与原图的尺寸相等
缺点:若扩展方法不当,补在靠近图像边缘的部分会给处理后的图像带来不良影响,而且会随着滤波器尺寸的增加而增大

matlab代码示例
%%%%%%%%%%
%  边界填充示例 %
%%%%%%%%%%
% 用matlab创建图像
A=ones(512,512)*255;
A(1:256,1:256)=0;
A(257:512,257:512)=0;
figure;
imshow(uint8(A));title('原图');
% 指定均值滤波器
f =ones(21,21);
% f =ones(21,21)/(21*21);
% 采用不同边界填充策略滤波
%f为滤波器,相当于卷积核
B1= imfilter(A,f,0,'full');
B2= imfilter(A,f,'replicate','full');
B3= imfilter(A,f,'symmetric','full');
B4= imfilter(A,f,'circular','full');
% 显示结果
figure;
subplot(231);imshow(uint8(A));title('原图');
subplot(232);imshow(mat2gray(B1));title('填充0');
subplot(233);imshow(mat2gray(B2));title('复制边界');
subplot(235);imshow(mat2gray(B3));title('镜像扩展');
subplot(236);imshow(mat2gray(B4));title('周期扩展');

结果:
在这里插入图片描述
好像不太明显。。。。不管了,可以把图片尺寸变大。
[file, path] = uigetfile({'*.jpg'; '*.bmp'; '*.gif'; '*.png' }, '选择图片');可选图片。
matlab中的imfilter函数介绍:
在这里插入图片描述

二,均值滤波

平滑滤波器的输出是包含在滤波器模版领域内的像素灰度的平均值,即均值滤波器
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三,中值滤波

可以使用matlab中的medfilt2函数:B=medfilt2(A,[m n]);
在这里插入图片描述
这里引用一个函数:medfilt_filter
添加链接描述

function [img]=median_filter(image, m)
%----------------------------------------------
%中值滤波
%输入:
%image:原图
%m:模板的大小3*3的模板,m=3

%输出:
%img:中值滤波处理后的图像
%----------------------------------------------
    n=m;
    [height, width]=size(image);
    x1=double(image);
    x2=x1;
    for i=1: height-n+1
        for j=1:width-n+1
            mb=x1(i:(i+n-1),j:(j+n-1));
            mb=mb(:);
            mm=median(mb);
            x2( i+(n-1)/2,j+(n-1)/2)=mm;
        end
    end
    img=uint8(x2);%matlab中uint16的范围是0-65535,uint8的范围是0-255。uint8(num)就是把num中大于255的强制赋值为255
end

在这里插入图片描述

[file, path] = uigetfile({'*.jpg'; '*.bmp'; '*.gif'; '*.png' }, '选择图片');
A = imread([path, file]);%取图
B=imnoise(A,'salt & pepper',0.02);%椒盐噪声污染
D = rgb2gray(B);%灰度处理
C=median_filter(D,3);
subplot(2,2,1);imshow(A);title('原图');
subplot(2,2,2);imshow(B);title('椒盐噪声污染图');
subplot(2,2,3);imshow(D);title('椒盐噪声污染灰度图');
subplot(2,2,4);imshow(C);title('中值滤波后');

运行结果:
在这里插入图片描述

四,统计排序滤波

matlab中的ordfilt2函数:B=ordfilt2(A,order,domain);
如:D = ordfilt2(B,5,ones(3,3));
在这里插入图片描述
在这里插入图片描述
matlab示例:

A = imread('cameraman.tif');
B = imnoise(A,'salt & pepper',0.05);
C = median_filter(B,[3 3]);
D = ordfilt2(B,5,ones(3,3));
figure;
subplot(221);imshow(A);title('原图');
subplot(222);imshow(B);title('椒盐噪声污染图');
subplot(223);imshow(C);title('中值滤波');
subplot(224);imshow(D);title('统计排序滤波');

运行结果:
在这里插入图片描述

reference:
李卫军,肖宛昂,董肖莉,覃鸿老师《视觉信息处理及FPGA实现》课程等

锐化下次写。
如有错误欢迎指出,转载请注明出处

2019-09-25 20:02:56 qq_41498261 阅读数 64
  • 软件测试入门视频教程

    软件测试入门视频培训教程:该课程将带你走进“软件测试”的大门,具体内容包括软件测试环境搭建、软件开发模型、产品模型、CMM模型、测试用例、等价类划分、边界值划分、白盒测试、单元测试、bugfree搭建、系统测试、回归测试、验收测试等。本课程以接地气的语言来讲解,让你听的懂,学的会!本课程以全新的方式为你呈现教学内容,清新脱俗独具特色的授课方式将带给你新的体验。

    2158781 人正在学习 去看看 李晓鹏

OpenCV中提供的图像滤波边沿处理方式有:

//! Various border types, image boundaries are denoted with `|`
//各种边界类型,图像边界使用“|”作为标记
//! @see borderInterpolate, copyMakeBorder
enum BorderTypes {
    //!< `iiiiii|abcdefgh|iiiiiii`  with some specified `i`
    BORDER_CONSTANT    = 0, 
    
    //!< `aaaaaa|abcdefgh|hhhhhhh`
    BORDER_REPLICATE   = 1, 
    
    //!< `fedcba|abcdefgh|hgfedcb`
    BORDER_REFLECT     = 2,
    
    //!< `cdefgh|abcdefgh|abcdefg`
    BORDER_WRAP        = 3, 
    
    //!< `gfedcb|abcdefgh|gfedcba`
    BORDER_REFLECT_101 = 4, 
    
    //!< `uvwxyz|abcdefgh|ijklmno`
    BORDER_TRANSPARENT = 5, 
    
    //!< same as BORDER_REFLECT_101
    BORDER_REFLECT101  = BORDER_REFLECT_101,
    
     //!< same as BORDER_REFLECT_101
    BORDER_DEFAULT     = BORDER_REFLECT_101, 
    
    //!< do not look outside of ROI
    BORDER_ISOLATED    = 16 
};

在这里插入图片描述

图像边沿的填充相关方法

borderInterpolate

  • 说明
    计算外推像素的源位置。

    当使用指定的外推边框模式时,该函数计算并返回与指定的外推像素对应的像素在原图中的坐标。例如,如果您在水平方向上使用cv :: BORDER_WRAP模式,而在垂直方向上使用cv :: BORDER_REFLECT_101,并要计算目标图像img中Point(-5,100)对应原图像的坐标,看起来像:

    float val = img.at<float>(borderInterpolate(100, img.rows, cv::BORDER_REFLECT_101),borderInterpolate(-5, img.cols, cv::BORDER_WRAP)); 
    

    通常,不直接调用该函数。它在滤波函数以及copyMakeBorder中使用。

  • 函数声明

     int borderInterpolate(int p, int len, int borderType);
    
  • 函数参数

    p 沿一个轴的外推像素的从0开始的坐标,可能为<0或> = len
    len 数组沿相应组的长度
    borderType 边框类型,一个BorderTypes,除了BORDER_TRANSPARENT和BORDER_ISOLATED。当borderType == BORDER_CONSTANT时,无论p和len如何,该函数始终返回-1。

copyMakeBorder


  • 函数说明
    函数将原图像赋值到目标图像中间。被复制的原图像的上,下,左,右区域将被填充像素值。

    当src已经在dst中间时,函数支持该模式。在这种情况下,函数不会复制src本身,而只是构造边界。

    当源图像是较大图像的一部分(roi)时,函数将尝试使用roi区域之外的像素来形成边框。若要禁用此功能并始终进行边框填充,就像src不是roi一样,使用bordertype

  • 函数声明区域从左到右,

    void copyMakeBorder(InputArray src, 
                      OutputArray dst,
                      int top, 
                      int bottom, 
                      int left, 
                      int right,
                      int borderType, 
                      const Scalar& value = Scalar() );
    
  • 函数参数

    src 原图像
    dst 与src类型相同的目标图像,图像尺寸Size(src.cols+left+right,src.rows+top+bottom)
    top 上方像素
    bottom 下方像素
    left 左侧像素
    right 右侧像素,指定源图像矩形中每个方向上的像素数的填充行数。例如,top=1,bottom=1,left=1,right=1表示1像素宽的边框需要被建造。
    borderType 边框类型
    value 当borderType值等于BORDER_CONSTANT时,指定边填充的值。

在这里插入图片描述

  • 首先创建一个5×5的图像矩阵:
    Mat myImage(Size(5, 5), CV_8UC1);
    	myImage.at<uchar>(0, 0) = 1;
    	myImage.at<uchar>(0, 1) = 2;
    	myImage.at<uchar>(0, 2) = 1;
    	myImage.at<uchar>(0, 3) = 4;
    	myImage.at<uchar>(0, 4) = 3;
    
    	myImage.at<uchar>(1, 0) = 1;
    	myImage.at<uchar>(1, 1) = 3;
    	myImage.at<uchar>(1, 2) = 2;
    	myImage.at<uchar>(1, 3) = 3;
    	myImage.at<uchar>(1, 4) = 4;
    
    	myImage.at<uchar>(2, 0) = 5;
    	myImage.at<uchar>(2, 1) = 2;
    	myImage.at<uchar>(2, 2) = 6;
    	myImage.at<uchar>(2, 3) = 8;
    	myImage.at<uchar>(2, 4) = 8;
    
    	myImage.at<uchar>(3, 0) = 5;
    	myImage.at<uchar>(3, 1) = 5;
    	myImage.at<uchar>(3, 2) = 7;
    	myImage.at<uchar>(3, 3) = 0;
    	myImage.at<uchar>(3, 4) = 8;
    
    	myImage.at<uchar>(4, 0) = 5;
    	myImage.at<uchar>(4, 1) = 6;
    	myImage.at<uchar>(4, 2) = 7;
    	myImage.at<uchar>(4, 3) = 8;
    	myImage.at<uchar>(4, 4) = 9;
    	
    
    
    	Mat dstMyImage;
    	
    	cout <<endl<< "  原图像灰度值:" << endl;
    	for (int i = 0; i < 5; i++)
    	{
    		const uchar* p = myImage.ptr<uchar>(i);
    		cout << "  ";
    		for (int j = 0; j < 5; j++)
    		{
    			if (j <= 3) {
    				cout << int(p[j]) << " , ";
    			}
    			else {
    				cout << int(p[j]) << endl;
    			}
    		}
    	}
    
  • BORDER_CONSTANT = 0
    需要设置borderValue指定i的值。
    其实质就是使用指定的值“i”代替边沿像素值进行卷积核操作。
       cout << endl << endl << "  当borderTypes为BORDER_CONSTANT=0时:" << endl;	
       //当borderValue取值为2
       copyMakeBorder(myImage, dstMyImage, 3, 3, 3, 3, 0,2);
       for (int i = 0; i < dstMyImage.rows; i++)
       {
       	cout << "  ";
       	const uchar* p = dstMyImage.ptr<uchar>(i);
       	for (int j = 0; j < dstMyImage.cols; j++)
       	{
       		if (j < dstMyImage.cols - 1) {
       			cout << int(p[j]) << " , ";
       		}
       		else {
       			cout << int(p[j]) << endl;
       		}
       	}
       }
    
    在这里插入图片描述

在这里插入图片描述

  • BORDER_REPLICATE = 1
    复制最近的一行或一列像素并一直延伸至添加边缘的宽度或高度。

    这种方式也就是OpenCV中的中值滤波medianBlur采用的边界处理方式。

    cout << endl << endl << "  当borderTypes为BORDER_REPLICATE=1时:" << endl;	
    	copyMakeBorder(myImage, dstMyImage, 3, 3, 3, 3, 1);
    	for (int i = 0; i < dstMyImage.rows; i++)
    	{
    		cout << "  ";
    		const uchar* p = dstMyImage.ptr<uchar>(i);
    		for (int j = 0; j < dstMyImage.cols; j++)
    		{
    			if (j < dstMyImage.cols - 1) {
    				cout << int(p[j]) << " , ";
    			}
    			else {
    				cout << int(p[j]) << endl;
    			}
    		}
    	}
    

    在这里插入图片描述

    在这里插入图片描述

  • BORDER_REFLECT = 2
    反射复制边界

    cout << endl << endl << "  当borderTypes为BORDER_REFLECT=2时:" << endl;	
    	copyMakeBorder(myImage, dstMyImage, 3, 3, 3, 3, 2);
    	for (int i = 0; i < dstMyImage.rows; i++)
    	{
    		cout << "  ";
    		const uchar* p = dstMyImage.ptr<uchar>(i);
    		for (int j = 0; j < dstMyImage.cols; j++)
    		{
    			if (j < dstMyImage.cols - 1) {
    				cout << int(p[j]) << " , ";
    			}
    			else {
    				cout << int(p[j]) << endl;
    			}
    		}
    	}
    

    在这里插入图片描述
    在这里插入图片描述
    发现上述结果不便于查找规律,扩大边界值:

    copyMakeBorder(myImage, dstMyImage, 5, 5, 5, 5, 2);
    在这里插入图片描述

    在这里插入图片描述

  • BORDER_WRAP = 3

    cout << endl << endl << "  当borderTypes为BORDER_WRAP=3时:" << endl;	
    	copyMakeBorder(myImage, dstMyImage, 3, 3, 3, 3, 3);
    	for (int i = 0; i < dstMyImage.rows; i++)
    	{
    		cout << "  ";
    		const uchar* p = dstMyImage.ptr<uchar>(i);
    		for (int j = 0; j < dstMyImage.cols; j++)
    		{
    			if (j < dstMyImage.cols - 1) {
    				cout << int(p[j]) << " , ";
    			}
    			else {
    				cout << int(p[j]) << endl;
    			}
    		}
    	}
    

    在这里插入图片描述
    将边界填充行扩大一些看,便于观察。

    copyMakeBorder(myImage, dstMyImage, 5, 5, 5, 5, 3);
    在这里插入图片描述

在这里插入图片描述

  • BORDER_REFLECT_101 = 4
    以边界为对称轴反射复制像素,也就是以最边缘像素为轴,对称。

    这种方式也是OpenCV边界处理的默认方式:(BORDER_DEFAULT=BORDER_REFLECT_101)

    是filter2D,blur,GaussianBlur,bilateralFilter的默认处理方式,所以这种方式在边界处理中应用还是非常广泛的。

    cout << endl << endl << "  当borderTypes为BORDER_REFLECT_101=4时:" << endl;	
    copyMakeBorder(myImage, dstMyImage, 3, 3, 3, 3, 4);
    for (int i = 0; i < dstMyImage.rows; i++)
    {
    	cout << "  ";
    	const uchar* p = dstMyImage.ptr<uchar>(i);
    	for (int j = 0; j < dstMyImage.cols; j++)
    	{
    		if (j < dstMyImage.cols - 1) {
    			cout << int(p[j]) << " , ";
    		}
    		else {
    			cout << int(p[j]) << endl;
    		}
    	}
    }
    
    

    在这里插入图片描述

    将边界填充行扩大一些看,便于观察。

    copyMakeBorder(myImage, dstMyImage, 5, 5, 5, 5, 4);
    在这里插入图片描述

    在这里插入图片描述

  • BORDER_TRANSPARENT = 5

    cout << endl << endl << "  当borderTypes为BORDER_TRANSPARENT=5时:" << endl;	
    	copyMakeBorder(myImage, dstMyImage, 3, 3, 3, 3, 5);
    	for (int i = 0; i < dstMyImage.rows; i++)
    	{
    		cout << "  ";
    		const uchar* p = dstMyImage.ptr<uchar>(i);
    		for (int j = 0; j < dstMyImage.cols; j++)
    		{
    			if (j < dstMyImage.cols - 1) {
    				cout << int(p[j]) << " , ";
    			}
    			else {
    				cout << int(p[j]) << endl;
    			}
    		}
    	}
    

    在这里插入图片描述

2013-04-02 20:18:00 tianzhaixing 阅读数 4420
  • 软件测试入门视频教程

    软件测试入门视频培训教程:该课程将带你走进“软件测试”的大门,具体内容包括软件测试环境搭建、软件开发模型、产品模型、CMM模型、测试用例、等价类划分、边界值划分、白盒测试、单元测试、bugfree搭建、系统测试、回归测试、验收测试等。本课程以接地气的语言来讲解,让你听的懂,学的会!本课程以全新的方式为你呈现教学内容,清新脱俗独具特色的授课方式将带给你新的体验。

    2158781 人正在学习 去看看 李晓鹏

为图像填充边界,以便进行滤波,卷积等有关图像边界处理的操作。

#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <stdlib.h>
#include <stdio.h>

using namespace cv;

//全局变量
Mat src, dst;
int top, bottom, left, right;//定义边界大小
int borderType;//边界处理类型
Scalar value;
char* window_name = "copyMakeBorder Demo";
RNG rng(12345);


int main( int argc, char** argv )
{

  int c;

  //加载图像
  src = imread( argv[1] );

  if( !src.data )
    { return -1;
      printf(" No data entered, please enter the path to an image file \n");
    }

  /// Brief how-to for this program
  printf( "\n \t copyMakeBorder Demo: \n" );
  printf( "\t -------------------- \n" );
  printf( " ** Press 'c' to set the border to a random constant value \n");
  printf( " ** Press 'r' to set the border to be replicated \n");
  printf( " ** Press 'ESC' to exit the program \n");

  //创建窗口
  namedWindow( window_name, CV_WINDOW_AUTOSIZE );

  //初始化滤波参数
  top = (int) (0.05*src.rows); bottom = (int) (0.05*src.rows);
  left = (int) (0.05*src.cols); right = (int) (0.05*src.cols);
  dst = src;

  imshow( window_name, dst );

  while( true )
       {
         c = waitKey(500);

         if( (char)c == 27 )//按ESC退出程序
           { break; }
         else if( (char)c == 'c' )
           { borderType = BORDER_CONSTANT; }
         else if( (char)c == 'r' )
           { borderType = BORDER_REPLICATE; }

         value = Scalar( rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255) );
         copyMakeBorder( src, dst, top, bottom, left, right, borderType, value );

         imshow( window_name, dst );
       }

  return 0;
}








2017-07-25 00:35:12 pianzang5201 阅读数 824
  • 软件测试入门视频教程

    软件测试入门视频培训教程:该课程将带你走进“软件测试”的大门,具体内容包括软件测试环境搭建、软件开发模型、产品模型、CMM模型、测试用例、等价类划分、边界值划分、白盒测试、单元测试、bugfree搭建、系统测试、回归测试、验收测试等。本课程以接地气的语言来讲解,让你听的懂,学的会!本课程以全新的方式为你呈现教学内容,清新脱俗独具特色的授课方式将带给你新的体验。

    2158781 人正在学习 去看看 李晓鹏

如果你想在图像周围创建一个边,就像相框一样,你可以使用cv2.copyMakeBorder() 函数。这经常在卷积运算或 0 填充时被用到。这个函数包括如下参数:

src 输入图像

top, bottom, left, right 对应边界的像素数目。

borderType 要添加那种类型的边界, 

value 边界颜色



import cv2
import numpy as np
from matplotlib import pyplot as plt

BLUE = [255, 0, 0]

imgl = cv2.imread('F:/circle.jpg')

replicate = cv2.copyMakeBorder(imgl, 10, 10, 10, 10, cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(imgl, 10, 10, 10, 10, cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(imgl, 10, 10, 10, 10, cv2.BORDER_REFLECT_101)
wrap = cv2.copyMakeBorder(imgl, 10, 10, 10, 10, cv2.BORDER_WRAP)
constant = cv2.copyMakeBorder(imgl, 10, 10, 10, 10, cv2.BORDER_CONSTANT, value=BLUE)

plt.subplot(231), plt.imshow(imgl, 'gray'),plt.title('ORIGINAL')
plt.subplot(232), plt.imshow(replicate, 'gray'), plt.title('REPLICATE')
plt.subplot(233), plt.imshow(reflect, 'gray'), plt.title('REFLECT')
plt.subplot(234), plt.imshow(reflect101, 'gray'),plt.title('REFLECT_101')
plt.subplot(235), plt.imshow(wrap, 'gray'), plt.title('WRAP')
plt.subplot(236), plt.imshow(constant, 'gray'), plt.title('CONSTANT')

plt.show()

上面的程序可以建立两个列表imgs和titles保存,名字,然后用循环表示出来。上面的subplot()中的三个数分别表示图显示的行,列和次序。(231)这个还可以写成(2,3,1)

结果图:(注意看两侧的不同)


2019-01-01 19:34:51 zzyczzyc 阅读数 348
  • 软件测试入门视频教程

    软件测试入门视频培训教程:该课程将带你走进“软件测试”的大门,具体内容包括软件测试环境搭建、软件开发模型、产品模型、CMM模型、测试用例、等价类划分、边界值划分、白盒测试、单元测试、bugfree搭建、系统测试、回归测试、验收测试等。本课程以接地气的语言来讲解,让你听的懂,学的会!本课程以全新的方式为你呈现教学内容,清新脱俗独具特色的授课方式将带给你新的体验。

    2158781 人正在学习 去看看 李晓鹏

OpenCV官网教程

原理

  • 一般在处理卷积操作的时候,遇到图像边界要么扩大图像,要么图像边界不做处理。对于增加图像边界通常有很多方法,这里介绍两种,使用的是OpenCV API cv::copyMakeBorder()
  1. BORDER_CONSTANT:给边界填充常量
  2. BORDER_REPLICATE:将原来的边界复制到扩大的边界

例程

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;

Mat dst, src;
int top,bottom,left,right;
int bordertype = cv::BORDER_CONSTANT;
const char* window_name = "copyMakeBorder Demo";
RNG rng(123);


int main(void)
{
	src = imread("../res/beauty.jpg");
	if(src.empty())
	{
		std::cout << "can't load the specific image" << std::endl;
	}

	top = (int)(0.05*src.rows); //扩展大小是0.05rows
	bottom = top;
	left = (int)(0.05*src.cols);
   	right = left;

	for(;;)
	{
		Scalar value(rng.uniform(0,255),rng.uniform(0,255),rng.uniform(0,255));//生成随机数
		cv::copyMakeBorder(src,dst,top,bottom,left,right,bordertype,value);
		imshow(window_name,dst);

		char c = (char)waitKey(500);//延时500ms
		if(c == 27) //ESC
			break;
		else if(c == 'c') 
			bordertype = cv::BORDER_CONSTANT;
		else if(c == 'r')
			bordertype = cv::BORDER_REPLICATE;
		
	}

	return 0;
};

结果:
在这里插入图片描述


OpenCV API

void cv::copyMakeBorder
(
InputArray src,     // 输入图像
OutputArray dst,    //输出图像
int top,    //
int bottom,    //
int left,    //
int right,    //每个边需要往外扩大的像素点数
int borderType,    // 见下图
const Scalar & value = Scalar()     //在borderType== BORDER_CONSTANT的时候,边界值
)

在这里插入图片描述

图像边界填充OpenCV

阅读数 387

opencv图像填充

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