opencv之为图像添加边界

我们经常会有对图像边缘做扩展的需求.比如

  • 希望卷积后得到的矩阵大小不变
  • 希望改变图像大小,但是不改变宽高比

opencv实现

opencv中使用copyMakeBorder()来完成这一功能
api

  • src是原图像矩阵
  • dst是新图像矩阵
  • top/bottom/left/right是边界扩展的大小(比如5就代表5个像素)
  • borderType
  • value是扩充的像素填什么值

borderType分两种:

  • BORDER_CONSTANT
    边缘填充用固定像素值,比如填充黑边,就用0,白边255
  • BORDER_REPLICATE
    用原始图像相应的边缘的像素去做填充,看起来有一种把图像边缘"拉糊了"的效果

opencv示例

import sys
import cv2 as cv

def test():
    src = cv.imread("/home/sc/disk/keepgoing/opencv_test/lights.jpeg")
    top = int(0.05 * src.shape[0])  # shape[0] = rows
    bottom = top
    left = int(0.04 * src.shape[1])  # shape[1] = cols
    right = left

    value = [0,0,0]
    borderType = cv.BORDER_CONSTANT
    dst1 = cv.copyMakeBorder(src, top, bottom, left, right, borderType, None, value)

    borderType = cv.BORDER_REPLICATE
    dst2 = cv.copyMakeBorder(src, top, bottom, left, right, borderType, None, value)

    cv.imshow("blackborder",dst1)
    cv.imshow("BORDER_REPLICATE",dst2)

    if 27 == cv.waitKey():
        cv.destroyAllWindows()

test()

效果如下:

原文地址:https://www.cnblogs.com/sdu20112013/p/11643420.html

时间: 10-09

opencv之为图像添加边界的相关文章

OpenCV特征点检测匹配图像-----添加包围盒

最终效果: 其实这个小功能非常有用,甚至加上只有给人感觉好像人脸检测,目标检测直接成了demo了,主要代码如下: // localize the object std::vector<Point2f> obj; std::vector<Point2f> scene; for (size_t i = 0; i < good_matches.size(); ++i) { // get the keypoints from the good matches obj.push_bac

OpenCV实现基于图像内容检索--视频播放(上)

最近要交个小作业,恰好刚开了博客园的博客,就想着把这个记下来当是做点笔记)=.=(,做的小作业的题目是基于图像内容的内容检索,主要是包括OpenCV和使用ActiveX插件两种方法来播放,这部分就写关于使用控件来实现视频播放的内容吧. [可能这几篇文章只是应用型的小作业,水平可能适合初学者看看,大牛略过就行] 开发环境: Win7+VS2012+OpenCV 1.首先,打开VS2012,文件-->新建-->项目-->MFC应用程序,输入项目"名称"为Video,点击&

OpenCV(C++版)图像读取,创建,复制,保存,显示

http://blog.163.com/yuyang_tech/blog/static/21605008320132642254689/ 一个小例子: #include "stdafx.h" #include <opencv2/opencv.hpp> using namespace std; using namespace cv; int _tmain(int argc, _TCHAR* argv[])// { //读入图像 const char* imagename =

opencv高效访问图像像素(遍历像素的方法总结)

一.Accessingpixel values访问像素值.(用类自带的方法:方便,但效率不高) 1.      cv::Mat has the a templatemethod at(int y, int x) 用法image.at<cv::Vec3b>(j,i)[channel]= value; 注意事项:the programmer needs to specify the return type that is expected(需认为指定返回值类型),一般使用type cv::Vec3

给图像添加logo

#include <opencv2\opencv.hpp>#include"ProcessPixels.h"using namespace cv;using namespace std; int main(){ Mat image=imread("E:\\yifu.jpg"); Mat logo=imread("E:\\wawa.jpg"); //默认以彩色图形式载入图像 Mat mask=imread("E:\\wawa.

OpenCV在MFC图像控件内显示图像

1.依照文章<OpenCV+MFC显示图像>,完毕配置. 2.创建对应的图像控件,button控件. 3.进行类型转换. 在当前OpenCV2版本号内,图像格式为cv::Mat ,而该格式无法直接在MFC内显示.因此,须要将其转换为能够在MFC内显示的CvvImage类格式,该类内有函数 DrawToHDC()支持MFC.试了一下无法直接实现,须要曲线救国.首先,将 格式cv::Mat变换为格式IplImage,再转换格式为 CvvImage. 还有问题,眼下openCV2版本号不再支持Cvv

[Android] 给图像添加相框、圆形圆角显示图片、图像合成知识

    前一篇文章讲述了Android触屏setOnTouchListener实现突破缩放.移动.绘制和添加水印,继续我的"随手拍"项目完成给图片添加相框.圆形圆角显示图片和图像合成的功能介绍.希望文章对大家有所帮助. 一. 打开图片和显示assets文件中图片 首先,对XML中activity_main.xml进行布局,通过使用RelativeLayout相对布局完成(XML代码后面附).然后,在Mainctivity.java中public class MainActivity e

opencv 批量处理图像

为了批量处理图像,网上找了好久,基本上都是C语言的sprinrf() 和 sprinrf_s()的方法:参数输入 只能是 char* 类型: 我下面献上C++的简洁方法. #include <opencv2/opencv.hpp>#include <iostream>#include <fstream>#include <string> using namespace cv;using namespace std; int main(){ Mat srcIm

C++&amp;OpenCV中读取图像到数组的两种

///method 1 read the image data one by one for (int row = 0, i = 0;row < imgDst.rows;row++) { for (int col = 0;col < imgDst.cols;col++) { cout << setw(3) << (int)imgDst.at<uchar>(row, col) << " "; arr[i] =imgDst.at&

opencv之访问图像像素

访问像素的三种方法 ①指针访问:最快 ②迭代器iterator:较慢,非常安全,指针访问可能出现越界问题 ③动态地址计算:更慢,通过at()实现.适用于访问具体某个第i行,j列的像素,而不适用遍历像素 Mat在内存中存储形式 灰度图的存储形式 RGB的存储形式 一般情况下,Mat是连续存储的,按行连接.可以通过isContinuous()函数,判断矩阵是否连续存储,若连续返回true. 访问像素的三种方法 1.指针访问 1 void VisitImgByPointer(Mat &inputImg