OpenCV 的四种边界生成方式

OpenCV 的 cvCopyMakeBorder 函数有四种边界生成方式,分别是 常量(constant)、复制(replicate)、反射(reflect) 和 包围(wrap)。它们的效果图如下:

OpenCV 的四种边界生成方式_第1张图片    OpenCV 的四种边界生成方式_第2张图片    OpenCV 的四种边界生成方式_第3张图片    OpenCV 的四种边界生成方式_第4张图片

原图是 Lena.jpg,512×512 的,扩充的边界是 左右上下 各 500 个像素。

代码如下:(未使用 cvCopyMakeBorder 函数)

/*
-------------------------------------------------------
类  名:	CWjpBorder
文件名:	WjpBorder.hpp
描  述:	完成图像的边界扩充。
备  注:	wujp	2013-07-01	初次创建。
-------------------------------------------------------
*/

#pragma once

class CWjpBorder
{
public:
	enum WjpBorderType
	{
		WJP_BORDER_CONSTANT = 1,
		WJP_BORDER_REPLICATE = 2,
		WJP_BORDER_REFLECT = 3,
		WJP_BORDER_WRAP = 4,
	};

public:
	CWjpBorder(){};
	virtual ~CWjpBorder(){};

public:
	void MakeBorder(const BYTE* pbySrcImage, int nSrcWidth, int nSrcHeight, int nBits, WjpBorderType borderType, 
					BYTE* pbyDstImage, int nDstWidth, int nDstHeight, BYTE byConstant = 0);
};

inline void CWjpBorder::MakeBorder(const BYTE* pbySrcImage, int nSrcWidth, int nSrcHeight, int nBits, WjpBorderType borderType, 
							BYTE* pbyDstImage, int nDstWidth, int nDstHeight, BYTE byConstant)
{
	if (nBits != 8 && nBits != 24)
		return;

	int nColorComponent = nBits / 8;

	int nSrcSize = nSrcWidth * nSrcHeight * nColorComponent;
	int nDstSize = nDstWidth * nDstHeight * nColorComponent;

	if (nSrcSize == nDstSize)
	{
		memcpy(pbyDstImage, pbySrcImage, nSrcSize);
		return;
	}

	int nXStart = (nDstWidth - nSrcWidth) / 2;
	int nYStart = (nDstHeight - nSrcHeight) / 2;

	// nXStart == nYStart
	
	if (borderType == WJP_BORDER_CONSTANT)
		memset(pbyDstImage, byConstant, nDstSize);
	
	int nSrcLineWidth = nSrcWidth * nColorComponent;
	int nDstLineWidth = nDstWidth * nColorComponent;
	int i;
	for (i=0; i



你可能感兴趣的:(编程)