亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? convolve.cpp

?? 圖像拼接框架源碼
?? CPP
字號:
///////////////////////////////////////////////////////////////////////////
//
// NAME
//  Convolve.cpp -- separable and non-separable linear convolution
//
// DESIGN NOTES
//
//  Upsampling is not supported:  zero-pad, then filter (see Pyramid.h).
//
//  The current version is quite inefficient, especially for separable
//  convolution, where vertical kernels use a complete extra set of iterators
//  that aren't necessary.
//
// SEE ALSO
//  Convolve.h          longer description of these routines
//
// Copyright ?Richard Szeliski, 2001.  See Copyright.h for more details
//
///////////////////////////////////////////////////////////////////////////

#include "Image.h"
#include "Convolve.h"

static int TrimIndex(int k, EBorderMode e, int n)
{
    // Compute the index value 0 <= k < n (return -1 for Zero mode)
    while (k < 0 || k >= n)
    {
        switch (e)
        {
        case eBorderZero:       // zero padding
            return -1;
        case eBorderReplicate:  // replicate border values
            return k = __max(0, __min(n-1, k));
        case eBorderReflect:    // reflect border pixels
            k = (k < 0) ? -k : (k < n) ? k : 2*(n-1)-k;
            break;              // may need to iterate if n < |k|
        case eBorderCyclic:     // wrap pixel values
            k = (k + n) % n;    // may need to iterate if k + n < 0
        }
    }
    return k;
}

template <class T>
static void FillRowBuffer(T buf[], CImageOf<T>& src, CFloatImage& kernel, int k, int n)
{
    // Compute the real row address
    CShape sShape = src.Shape();
    int nB = sShape.nBands;
    int k0 = TrimIndex(k + kernel.origin[1], src.borderMode, sShape.height);
    if (k0 < 0)
    {
        memset(buf, 0, n * sizeof(T));
        return;
    }

    // Fill the row
    T* srcP = &src.Pixel(0, k0, 0);
    int m = n / nB;
    for (int l = 0; l < m; l++, buf += nB)
    {
        int l0 = TrimIndex(l + kernel.origin[0], src.borderMode, sShape.width);
        if (l0 < 0)
            memset(buf, 0, nB * sizeof(T));
        else
            memcpy(buf, &srcP[l0*nB], nB * sizeof(T));
    }
}

template <class T>
void ConvolveRow(CImageOf<T> buffer, CFloatImage kernel, T* dst,
                 int n, T minVal, T maxVal)
{
    CShape kShape = kernel.Shape();
    int kX  = kShape.width;
    int kY  = kShape.height;
    CShape bShape = buffer.Shape();
    int nB  = bShape.nBands;

    for (int i = 0; i < n; i++)
    {
        for (int b = 0; b < nB; b++)
        {
            float sum = 0.0f;
            for (int k = 0; k < kY; k++)
            {
                float* kPtr = &kernel.Pixel(0, k, 0);
                T*     bPtr = &buffer.Pixel(i, k, b);
                for (int l = 0; l < kX; l++, bPtr += nB)
                    sum += kPtr[l] * bPtr[0];
            }
            *dst++ = (T) __max(minVal, __min(maxVal, sum));
        }
    }
}

template <class T>
void Convolve(CImageOf<T> src, CImageOf<T>& dst,
              CFloatImage kernel)
{
    // Determine the shape of the kernel and source image
    CShape kShape = kernel.Shape();
    CShape sShape = src.Shape();

    // Allocate the result, if necessary
    dst.ReAllocate(sShape, false);
    if (sShape.width * sShape.height * sShape.nBands == 0)
        return;

    // Do the convolution
    for (int y = 0; y < sShape.height; y++)
		for (int x = 0; x < sShape.width; x++)
			for (int c = 0; c < sShape.nBands; c++)
			{
				double sum = 0;
				for (int k = 0; k < kShape.height; k++)
					for (int l = 0; l < kShape.width; l++)
						if ((x-kernel.origin[0]+k >= 0) && (x-kernel.origin[0]+k < sShape.width) && (y-kernel.origin[1]+l >= 0) && (y-kernel.origin[1]+l < sShape.height))
							sum += kernel.Pixel(k,l,0) * src.Pixel(x-kernel.origin[0]+k,y-kernel.origin[1]+l,c);
				dst.Pixel(x,y,c) = (T) __max(dst.MinVal(), __min(dst.MaxVal(), sum));
			}
}

template <class T>
void ConvolveSeparable(CImageOf<T> src, CImageOf<T>& dst,
                       CFloatImage x_kernel, CFloatImage y_kernel,
                       int subsample)
{
    // Allocate the result, if necessary
    CShape dShape = src.Shape();
    if (subsample > 1)
    {
        dShape.width  = (dShape.width  + subsample-1) / subsample;
        dShape.height = (dShape.height + subsample-1) / subsample;
    }
    dst.ReAllocate(dShape, false);

    // Allocate the intermediate images
    CImageOf<T> tmpImg1(src.Shape());
    CImageOf<T> tmpImg2(src.Shape());

    // Create a proper vertical convolution kernel
    CFloatImage v_kernel(1, y_kernel.Shape().width, 1);
    for (int k = 0; k < y_kernel.Shape().width; k++)
        v_kernel.Pixel(0, k, 0) = y_kernel.Pixel(k, 0, 0);
    v_kernel.origin[1] = y_kernel.origin[0];

    // Perform the two convolutions
    Convolve(src, tmpImg1, x_kernel);
    Convolve(tmpImg1, tmpImg2, v_kernel);

    // Downsample or copy
    for (int y = 0; y < dShape.height; y++)
    {
        T* sPtr = &tmpImg2.Pixel(0, y * subsample, 0);
        T* dPtr = &dst.Pixel(0, y, 0);
        int nB  = dShape.nBands;
        for (int x = 0; x < dShape.width; x++)
        {
            for (int b = 0; b < nB; b++)
                dPtr[b] = sPtr[b];
            sPtr += subsample * nB;
            dPtr += nB;
        }
    }
}

template <class T>
void InstantiateConvolutionOf(CImageOf<T> img)
{
    CFloatImage kernel;
    ConvolveSeparable(img, img, kernel, kernel, 1);
}

void InstantiateConvolutions()
{
    InstantiateConvolutionOf(CByteImage());
    InstantiateConvolutionOf(CIntImage());
    InstantiateConvolutionOf(CFloatImage());
}

//
//  Default kernels
//

CFloatImage ConvolveKernel_121;
CFloatImage ConvolveKernel_14641;
CFloatImage ConvolveKernel_8tapLowPass;

struct KernelInit
{
    KernelInit();
};

KernelInit::KernelInit()
{
    static float k_11[2] = {0.5f, 0.5f};
    static float k_121[3] = {0.25f, 0.5f, 0.25f};
    static float k_14641[5] = {0.0625f, 0.25f, 0.375f, 0.25f, 0.0625f};
    static float k_8ptFP[8] = {-0.044734f, -0.059009f,  0.156544f,  0.449199f,
                                0.449199f,  0.156544f, -0.059009f, -0.044734f};
    // The following are derived as fix-point /256 fractions of the above:
    //  -12, -15, 40, 115
    static float k_8ptI [8] = {-0.04687500f, -0.05859375f,  0.15625000f,  0.44921875f,
                                0.44921875f,  0.15625000f, -0.05859375f, -0.04687500f};

    ConvolveKernel_121.ReAllocate(CShape(3, 1, 1), k_121, false, 3);
    ConvolveKernel_121.origin[0] = -1;
    ConvolveKernel_14641.ReAllocate(CShape(5, 1, 1), k_14641, false, 5);
    ConvolveKernel_14641.origin[0] = -2;
    ConvolveKernel_8tapLowPass.ReAllocate(CShape(8, 1, 1), k_8ptI, false, 8);
    ConvolveKernel_8tapLowPass.origin[0] = -4;
}

KernelInit ConvKernelInitializer;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产亚洲成av人在线观看导航| 欧美videos大乳护士334| 欧美二区三区91| 亚洲综合色婷婷| 在线看国产一区二区| 亚洲免费在线看| 欧美午夜视频网站| 婷婷久久综合九色国产成人 | 91.xcao| 日韩电影免费在线观看网站| 福利电影一区二区三区| 国产精品欧美综合在线| 一道本成人在线| 天天操天天干天天综合网| av一区二区三区黑人| 亚洲精品va在线观看| 欧美一区二区视频在线观看 | 蜜桃精品在线观看| 日本电影欧美片| 国产精品视频线看| 国产毛片精品国产一区二区三区| 欧美精品tushy高清| 精品制服美女丁香| 综合色中文字幕| 粉嫩av一区二区三区在线播放| 5月丁香婷婷综合| 国产精品一色哟哟哟| 亚洲人精品午夜| 日韩一区二区精品| 99久久婷婷国产综合精品| 午夜精品影院在线观看| 国产日产欧美精品一区二区三区| 久久精品国产精品亚洲综合| 欧美久久一区二区| 国产成人综合自拍| 久久精品欧美一区二区三区不卡 | 亚洲一区在线免费观看| 欧美一二三四在线| 91麻豆国产精品久久| 日本一道高清亚洲日美韩| 国产精品久久久久久久久免费桃花 | 欧美在线免费视屏| 国产麻豆日韩欧美久久| 亚洲午夜久久久| 亚洲国产成人午夜在线一区| 成人av在线一区二区三区| 丝袜美腿亚洲综合| 日韩一区二区三区视频在线观看| 水蜜桃久久夜色精品一区的特点 | 成人av在线电影| 奇米色一区二区| 精品av综合导航| 欧美三级韩国三级日本一级| 成人高清视频在线| 亚洲素人一区二区| 久久久不卡网国产精品二区| 91精品国产91综合久久蜜臀| 欧美亚洲综合久久| 91视频.com| 成人丝袜高跟foot| 一区二区免费看| 国产精品久久久久影院色老大 | 六月丁香综合在线视频| 亚洲综合色在线| 一区二区在线免费观看| 国产精品色婷婷久久58| 国产丝袜在线精品| 久久久久久久综合日本| 精品国产乱码久久久久久久久| 国产成人免费网站| 国产一区中文字幕| 精品一区二区免费看| 麻豆国产欧美一区二区三区| 国产亚洲一区二区在线观看| 一本久久精品一区二区| 日本美女一区二区三区视频| 亚洲高清一区二区三区| 久久综合狠狠综合久久激情| 日韩视频一区二区三区在线播放| 国产成人综合在线播放| 国产成人在线网站| 丁香五精品蜜臀久久久久99网站| 午夜精品久久久| 天天综合网 天天综合色| 国产午夜精品一区二区三区视频| 欧美亚洲综合在线| 欧美日韩日日摸| 欧美一区二区在线不卡| 精品久久久三级丝袜| 国产亚洲福利社区一区| 中文字幕成人网| 亚洲男人的天堂av| 亚洲bt欧美bt精品| 美女性感视频久久| 国产精品原创巨作av| 成人av在线资源网站| 色综合久久六月婷婷中文字幕| 国内精品免费在线观看| 从欧美一区二区三区| 日本午夜精品一区二区三区电影| 亚洲桃色在线一区| 亚洲高清免费视频| 美国欧美日韩国产在线播放| 国产资源精品在线观看| av毛片久久久久**hd| 欧美视频一区二区三区在线观看 | 欧美日韩大陆在线| 欧美成人aa大片| 欧美日韩视频专区在线播放| 欧美变态口味重另类| 国产精品久久久久久妇女6080| 久久综合久久综合九色| 中文字幕一区三区| 日韩和欧美一区二区| 成人一道本在线| 欧美午夜一区二区三区免费大片| 91在线播放网址| 91麻豆精品国产自产在线观看一区| 色婷婷综合久久久中文一区二区| 国产成人免费在线观看| 欧美日韩一区中文字幕| 欧日韩精品视频| www一区二区| 亚洲综合丁香婷婷六月香| 麻豆精品国产传媒mv男同| 视频一区二区中文字幕| 盗摄精品av一区二区三区| 国产黄色精品网站| 欧美喷潮久久久xxxxx| 国产欧美一区二区精品性色超碰| 久久久久久99久久久精品网站| 精品久久久网站| 亚洲国产成人精品视频| 波多野结衣的一区二区三区| 欧美丰满高潮xxxx喷水动漫| 中文字幕av一区二区三区高| 国产精品污www在线观看| 偷拍亚洲欧洲综合| 91丝袜国产在线播放| 久久久精品影视| 日本vs亚洲vs韩国一区三区| av电影在线观看不卡| 久久久久久久综合狠狠综合| 天堂久久一区二区三区| 色拍拍在线精品视频8848| 国产婷婷色一区二区三区四区| **网站欧美大片在线观看| 国模少妇一区二区三区| 粉嫩一区二区三区在线看| 91麻豆精品国产91久久久更新时间| 欧美一区二区视频免费观看| 一区二区在线观看不卡| 午夜不卡av在线| 91免费视频网址| 国产精品久久久久9999吃药| 久久疯狂做爰流白浆xx| 91精品国产综合久久香蕉麻豆| 欧美一区二区网站| 视频一区二区国产| 欧美性生活影院| 亚洲国产视频一区二区| 91麻豆swag| 一区二区三区久久久| 97se狠狠狠综合亚洲狠狠| 欧美精选一区二区| 精品国产人成亚洲区| 蜜桃视频一区二区三区在线观看| 国产成人午夜精品影院观看视频 | 国产乱理伦片在线观看夜一区| 波多野洁衣一区| 国产精品午夜在线| 99久久综合国产精品| 欧美日韩中文字幕一区| 亚洲成人综合在线| 精品少妇一区二区三区在线播放 | 久久精品水蜜桃av综合天堂| 韩国一区二区三区| 91麻豆视频网站| 日韩一区二区三区视频在线| 日韩激情视频在线观看| 91精品国产综合久久福利| 日本午夜精品视频在线观看| 欧美一区二区人人喊爽| 久久成人久久爱| 国产午夜精品久久久久久久| 国产不卡在线一区| 亚洲视频免费在线观看| 久久99日本精品| 久久久蜜臀国产一区二区| 成人夜色视频网站在线观看| 亚洲图片激情小说| 欧美日韩一区二区三区高清| 天天操天天色综合| 日本久久电影网| 天天av天天翘天天综合网| 精品88久久久久88久久久| 成人国产电影网| 五月婷婷久久综合| 久久综合国产精品| 91视频.com|