青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

coreBugZJ

此 blog 已棄。

數(shù)字圖像處理上機之五:圖像平滑和銳化


在圖像中,通過鄰接點的相互平均可以去掉一些突然變化的點,從而過濾掉一定的噪聲,達到平滑的目的,但圖像有一定程度上的模糊。
本實驗使用模板
        1  1  1
        1  1  1
        1  1  1
即每一個像素的灰度都是自身和周圍8個像素的平均值。


圖像銳化處理的目的是使模糊的圖像變得更加清晰起來,而圖像模糊的實質(zhì)就是圖像受到平均或積分運算造成的,因此可以對圖像進行逆運算(如微分)來使圖像清晰化。梯度銳化是一種常用的微分銳化方法。


Sobel 初步嘗試,其卷積計算核有兩個,

Sx =
        -1  0  1
        -2  0  2
        -1  0  1

Sy =
        1   2   1
        0   0   0
       -1  -2  -1

一個對垂直邊緣影響最大,一個對水平邊緣影響最大。圖像中每點均分別用這兩個算子作卷積,取兩個卷積絕對值的和。


圖像中的邊緣及急劇變化部分與圖像高頻分量有關(guān),利用低通濾波減弱高頻部分能實現(xiàn)圖像平滑,利用高通濾波減弱低頻部分能實現(xiàn)圖像銳化。


圖像FFT 后注意原點。










原圖



FFT 后



FFT 后高通濾波



高通濾波



FFT 后低通濾波



低通濾波



平滑



Sobel






 

/*
ProcessFilterZ.h

Copyright (C) 2011, coreBugZJ, all rights reserved.

濾波。
*/


#ifndef  __PROCESSFILTER_Z_H_INCLUDED__
#define  __PROCESSFILTER_Z_H_INCLUDED__


#include "TypeZ.h"
#include "ClassImageZ.h"


        /* 高通 低通 濾波器 */
        /* 對寬為 (1<<lgw) 高為 (1<<lgh) 且 2d FFT 后的矩陣 */
        /* 點的定位同 2d FFT */
        /* 會修改矩陣 */
        /* if 參數(shù)highPass then 高通 else 低通 */
        /* == radius 也通過 */
        /* 成功返回 ROK */
PublicFuncZ  R32  highLowPassFilterZ( CF64 *mat, U32 lgw, U32 lgh, F64 radius, B32 highPass );
        /* 在圖像上使用 n * n 的模板 mat,然后 乘以 mulFactor 除以 divFactor */
        /* 假設(shè) n 為奇數(shù) */
        /* 會修改圖像 */
        /* 模板 mat 中第 y 行第 x 列的點(x,y)為 mat[ y * n + x ] */
        /* 圖像邊緣無法使用模板處,保持不變 */
        /* 成功返回 ROK */
PublicFuncZ  R32  templateFilterZ( ImageZ img, I32 *mat, U32 n, I32 mulFactor, I32 divFactor );


        /* 平滑 */
        /* 會修改圖像 */
        /* 成功返回 ROK */
PublicFuncZ  R32  smoothImageZ( ImageZ img );
        /* 銳化 sobel */
        /* 會修改圖像 */
        /* 成功返回 ROK */
PublicFuncZ  R32  sharpImageZ( ImageZ img );


#endif /* __PROCESSFILTER_Z_H_INCLUDED__ */








 

/*
ProcessFilterZ.c

Copyright (C) 2011, coreBugZJ, all rights reserved.

濾波。
*/


#include "stdafx.h"
#include "ProcessFilterZ.h"
#include "ProcessGrayZ.h"

#include <malloc.h>


PublicFuncZ  R32  highLowPassFilterZ( CF64 *mat, U32 lgw, U32 lgh, F64 radius, B32 highPass ) {
        U32  x, y, w, h, xc, yc;
        F64  r2m4, d2m4, f0, f1;
        I32  cmp;

        if ( (NULL == mat) ) {
                return RERR;
        }

        w = PWR2_U32_Z( lgw );
        h = PWR2_U32_Z( lgh );
        MUL_F64_Z( r2m4, radius, radius );
        MUL_F64_U32_Z( r2m4, r2m4, 4 );

        for ( y = 0; y < h; ++y ) {
                yc = ( y + (h>>1) ) % h;
                for ( x = 0; x < w; ++x ) {
                        xc = ( x + (w>>1) ) % w;

                        MOV_F64_U32_Z( f0, xc );
                        ADD_F64_U32_Z( f0, f0, xc );
                        SUB_F64_U32_Z( f0, f0, w );
                        MUL_F64_Z( f0, f0, f0 );

                        MOV_F64_U32_Z( f1, yc );
                        ADD_F64_U32_Z( f1, f1, yc );
                        SUB_F64_U32_Z( f1, f1, h );
                        MUL_F64_Z( f1, f1, f1 );

                        ADD_F64_Z( d2m4, f0, f1 );

                        CMP_F64_Z( cmp, d2m4, r2m4 );
                        if ( highPass ) {
                                if ( cmp < 0 ) {
                                        MOV_CF64_U32_Z( mat[ y * w + x ], 0, 0 );
                                }
                        }
                        else {
                                if ( cmp > 0 ) {
                                        MOV_CF64_U32_Z( mat[ y * w + x ], 0, 0 );
                                }
                        }
                }
        }

        return ROK;
}


PublicFuncZ  R32  templateFilterZ( ImageZ img, I32 *mat, U32 n, I32 mulFactor, I32 divFactor ) {
        U32  w, h, x, y, ix, iy, nha;
        I32  pix, *ptrmat;
        U08  *ptrimg, *ptrpix;

        if ( (!isImageValidZ(img)) || (NULL == mat) || (0 == divFactor) || (3 > n) ) {
                return RERR;
        }

        if ( GRAY_NUM_Z != img->colorNum ) {
                return RERR; /* 目前只支持 256 灰度 */
        }

        nha = n / 2 + 1;
        w   = img->width;
        h   = img->height;

        for ( y = n; y <= h; ++y ) {
                ptrpix = img->pPixel + (y - nha) * img->linePitch + (n - nha);
                for ( x = n; x <= w; ++x ) {
                        pix = 0;
                        ptrmat = mat;
                        for ( iy = y-n; iy < y; ++iy ) {
                                ptrimg = img->pPixel + iy * img->linePitch + (x - n);
                                for ( ix = x-n; ix < x; ++ix ) {
                                        pix += (*ptrimg) * (*ptrmat);
                                        ++ptrimg;
                                        ++ptrmat;
                                }
                        }
                        pix = pix * mulFactor / divFactor;
                        if ( pix >= GRAY_NUM_Z ) {
                                pix = GRAY_NUM_Z - 1;
                        }
                        *ptrpix = (U08)(pix);
                        ++ptrpix;
                }
        }

        return ROK;
}


PublicFuncZ  R32  smoothImageZ( ImageZ img ) {
        I32 mat[] = {
                1, 1, 1,
                1, 1, 1,
                1, 1, 1
        };
        return templateFilterZ( img, mat, 3, 1, 9 );
}

PublicFuncZ  R32  sharpImageZ( ImageZ img ) {
        I32    *mat = NULL;
        U32    width, height, x, y;
        I32    v0, v1;
        R32    res;

        if ( !isImageValidZ(img) ) {
                return RERR;
        }

        if ( GRAY_NUM_Z != img->colorNum ) {
                return RERR; /* 256 級灰度 */
        }

        width  = img->width;
        height = img->height;

        mat = (I32*)malloc( width * height * sizeof(I32) );
        if ( NULL == mat ) {
                return RERR;
        }

#define  PIX(ix,iy)  ((I32)(img->pPixel[(iy) * img->linePitch + (ix)]))
        for ( y = 0; y < height; ++y ) {
                for ( x = 0; x < width; ++x ) {
                        v0 = ( PIX(x+1, y-1) + 2*PIX(x+1, y) + PIX(x+1, y+1) ) -
                             ( PIX(x-1, y-1) + 2*PIX(x-1, y) + PIX(x-1, y+1) );
                        if ( 0 > v0 ) v0 = -v0;

                        v1 = ( PIX(x-1, y+1) + 2*PIX(x, y+1) + PIX(x+1, y+1) ) -
                             ( PIX(x-1, y+1) + 2*PIX(x, y+1) + PIX(x+1, y-1) );
                        if ( 0 > v1 ) v1 = -v1;

                        mat[ y * width + x ] = v0 + v1;
                }
        }
#undef  PIX

        res = scaleImageZ( img, mat, width, height );

        free( mat );
        mat = NULL;

        return res;
}





 

PublicFuncZ  ImageZ  createImageScaleZ( I32 *mat, U32 width, U32 height ) {
        ImageZ  img = NULL;

        if ( (NULL == mat) || (1 > width) || (1 > height) ) {
                return NULL;
        }

        img = createImageZ( width, height, GRAY_NUM_Z );
        if ( NULL == img ) {
                return NULL;
        }

        if ( ROK == scaleImageZ(img, mat, width, height) ) {
                return img;
        }

        destroyImageZ( img );
        img = NULL;

        return NULL;
}

PublicFuncZ  R32  scaleImageZ( ImageZ img, I32 *mat, U32 width, U32 height ) {
        U32     x, y, i;
        I32     matMin, matMax, mv;

        if ( (NULL == mat) || (1 > width) || (1 > height) ||
             (!isImageValidZ(img)) || (GRAY_NUM_Z != img->colorNum) ||
             (width != img->width) || (height != img->height)
           ) {
                return RERR;
        }

        for ( i = 0; i < GRAY_NUM_Z; ++i ) {
                img->pPalette[ i * IMAGEZ_COLOR_SIZE_Z + IMAGEZ_OFFSET_BLUE_Z  ] =
                img->pPalette[ i * IMAGEZ_COLOR_SIZE_Z + IMAGEZ_OFFSET_GREEN_Z ] =
                img->pPalette[ i * IMAGEZ_COLOR_SIZE_Z + IMAGEZ_OFFSET_RED_Z   ] = (U08)(i);
                img->pPalette[ i * IMAGEZ_COLOR_SIZE_Z + IMAGEZ_OFFSET_ALPHA_Z ] = 255;
        }

        matMin = matMax = mat[ 0 ];
        for ( y = 0; y < height; ++y ) {
                for ( x = 0; x < width; ++x ) {
                        mv = mat[ y * width + x ];
                        if ( matMin > mv ) {
                                matMin = mv;
                        }
                        if ( matMax < mv ) {
                                matMax = mv;
                        }
                }
        }

        mv = matMax - matMin;
        if ( 0 == mv ) {
                mv = 1;
        }
        for ( y = 0; y < height; ++y ) {
                for ( x = 0; x < width; ++x ) {
                        img->pPixel[ y * img->linePitch + x ] = (U08)(
                                (mat[ y * width + x ] - matMin) * (GRAY_NUM_Z-1) / mv );
                }
        }

        return ROK;
}






 

PublicFuncZ  ImageZ  createImageFromFftDataZ( CF64 *mat, U32 lgw, U32 lgh ) {
        ImageZ  img = NULL;
        U32     w, h, x, y, i, tu;
        F64     tf255, tf;
        U08     *ptrimg;
        CF64    *ptrmat;

        if ( NULL == mat ) {
                return NULL;
        }

        w   = PWR2_U32_Z( lgw );
        h   = PWR2_U32_Z( lgh );
        img = createImageZ( w, h, GRAY_NUM_Z );
        if ( NULL == img ) {
                return NULL;
        }

        ptrimg = img->pPalette;
        for ( i = 0; i < GRAY_NUM_Z; ++i ) {
                ptrimg[ IMAGEZ_OFFSET_BLUE_Z  ] =
                        ptrimg[ IMAGEZ_OFFSET_GREEN_Z ] =
                        ptrimg[ IMAGEZ_OFFSET_RED_Z   ] = (U08)(i);
                ptrimg[ IMAGEZ_OFFSET_ALPHA_Z ] = 255;
                ptrimg += IMAGEZ_COLOR_SIZE_Z;
        }

        MOV_F64_U32_Z( tf255, 255 );
        for ( y = 0; y < h; ++y ) {
                ptrimg = img->pPixel + ((y+(h>>1))%h) * img->linePitch;
                ptrmat = mat + y * w;
                for ( x = 0; x < w; ++x ) {
                        M_CF64_Z( tf, *ptrmat );
                        ++ptrmat;
                        DIV_F64_U32_Z( tf, tf, 100 );
                        MIN_F64_Z( tf, tf, tf255 );
                        MOV_U32_F64_Z( tu, tf );
                        *(ptrimg + (x+(w>>1))%w ) = (U08)(tu);
                }
        }

        return img;
}

 


posted on 2011-12-14 20:21 coreBugZJ 閱讀(3026) 評論(0)  編輯 收藏 引用 所屬分類: VideoImageAlgorithm課內(nèi)作業(yè)

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            毛片av中文字幕一区二区| 欧美高潮视频| 亚洲国产欧美另类丝袜| 久久久精品国产一区二区三区| 在线综合亚洲| 亚洲欧美中文另类| 久久精品人人| 欧美日韩视频| 久久久国产精品一区二区三区| 久久久久高清| 欧美大尺度在线| 午夜久久久久久久久久一区二区| 欧美精品一区在线播放| 日韩视频免费观看| 午夜精品一区二区三区电影天堂| 99re6热只有精品免费观看| 欧美一级二区| 欧美.com| 欧美成人福利视频| 欧美第十八页| 欧美激情中文字幕乱码免费| 久久精彩视频| 久久―日本道色综合久久| 亚洲免费伊人电影在线观看av| 亚洲精品久久久久久久久久久| 欧美xx69| 亚洲精品国偷自产在线99热| 一区二区欧美日韩视频| 中日韩美女免费视频网址在线观看 | 亚洲福利在线看| 国产精品视频区| 欧美国产精品日韩| 欧美激情一区二区三级高清视频| 精品99视频| 亚洲国产精品福利| 一区二区高清| 欧美自拍偷拍午夜视频| 亚洲第一福利社区| 欧美久久久久| 久久人人爽人人爽爽久久| 亚洲黄色影院| 久久精品久久99精品久久| 久久av二区| 亚洲国产婷婷香蕉久久久久久99| 亚洲欧美日韩专区| 性欧美超级视频| 欧美一区高清| 亚洲人成在线播放网站岛国| 欧美在线中文字幕| 国产日韩欧美制服另类| 亚洲一区三区电影在线观看| 欧美激情乱人伦| 老色鬼久久亚洲一区二区| 国产亚洲成精品久久| 午夜精品在线看| 中文欧美日韩| 国产精品人人爽人人做我的可爱 | 国产精品国内视频| 99亚洲视频| 亚洲靠逼com| 欧美.www| 一区二区三区高清不卡| 亚洲精品日本| 国产精品扒开腿爽爽爽视频 | 亚洲影音先锋| 国产欧美日韩在线播放| 久久本道综合色狠狠五月| 亚洲综合色激情五月| 国产精品久久久久aaaa| 欧美夜福利tv在线| 欧美一区二区三区的| 国内欧美视频一区二区| 久久综合色天天久久综合图片| 久久精品av麻豆的观看方式| 怡红院精品视频| 欧美激情一区二区三区成人| 欧美国产第一页| 亚洲一区二区三区四区中文| 亚洲天堂av高清| 国产中文一区| 亚洲国产婷婷| 国产精品一区二区在线观看| 久久综合99re88久久爱| 老司机免费视频一区二区三区| av成人免费在线| 亚洲欧美日韩一区| 亚洲国产精品久久久久秋霞蜜臀 | 美女精品网站| 欧美国产丝袜视频| 性色av一区二区三区在线观看| 欧美在线视频二区| 夜夜爽av福利精品导航| 午夜久久美女| 99天天综合性| 欧美主播一区二区三区美女 久久精品人| 一区二区在线不卡| 亚洲最新视频在线| 一区国产精品| 亚洲天堂av电影| 亚洲国产小视频在线观看| 99热精品在线观看| 亚洲免费观看| 欧美激情精品久久久久久| 99re6这里只有精品| 一本色道婷婷久久欧美| 国产偷国产偷精品高清尤物| 亚洲电影专区| 国产精品九九| 欧美不卡视频| 国产一级精品aaaaa看| 亚洲精品影视| 在线免费不卡视频| 亚洲影院免费观看| 99视频超级精品| 久久婷婷麻豆| 久久国产精品久久精品国产| 欧美理论片在线观看| 欧美黄色免费网站| 影音先锋亚洲视频| 久久国产精品第一页| 欧美一区二区网站| 国产精品剧情在线亚洲| 日韩视频免费在线| 亚洲最新中文字幕| 欧美理论大片| 亚洲精品一区二区三区在线观看 | 亚洲电影在线看| 午夜日韩av| 欧美一区二区三区婷婷月色| 欧美日精品一区视频| 亚洲美女在线国产| 99re视频这里只有精品| 麻豆精品网站| 亚洲国产精品va| 日韩午夜在线观看视频| 亚洲免费观看在线视频| 欧美高清视频免费观看| 欧美激情欧美激情在线五月| 亚洲第一精品久久忘忧草社区| 久久频这里精品99香蕉| 蜜桃av综合| 最新国产成人在线观看| 欧美二区不卡| 日韩亚洲欧美一区二区三区| 在线视频精品| 国产精品久久久久久久久久久久久| 99av国产精品欲麻豆| 亚洲影视九九影院在线观看| 国产精品网站视频| 欧美在线一二三四区| 裸体丰满少妇做受久久99精品| 黑丝一区二区三区| 蜜月aⅴ免费一区二区三区| 亚洲破处大片| 午夜精品久久久久久久99水蜜桃| 国产乱码精品1区2区3区| 久久久久久色| 日韩视频不卡中文| 久久国产婷婷国产香蕉| 亚洲视频999| 在线观看成人av| 美女视频黄免费的久久| 91久久在线播放| 亚洲一区二区三区四区视频| 国产日韩欧美精品一区| 蜜桃久久精品一区二区| 亚洲美女av在线播放| 欧美一二三视频| 亚洲二区免费| 国产精品裸体一区二区三区| 久久五月天婷婷| 在线综合欧美| 欧美国产日韩一区二区三区| 亚洲欧美日韩国产一区二区三区| 狠狠色丁香久久婷婷综合丁香 | 亚洲激情图片小说视频| 欧美日韩视频一区二区三区| 午夜精品久久久| 亚洲国产裸拍裸体视频在线观看乱了| 亚洲一卡久久| 亚洲二区三区四区| 国产精品视频yy9099| 欧美顶级艳妇交换群宴| 久久gogo国模裸体人体| 99国内精品久久| 欧美成人激情视频免费观看| 亚洲欧美日韩天堂一区二区| 91久久精品一区二区别| 国产亚洲欧美日韩精品| 欧美偷拍另类| 亚洲自拍偷拍网址| 亚洲精品极品| 亚洲电影免费观看高清完整版在线 | 亚洲激情中文1区| 久久久久成人精品免费播放动漫| 一区二区欧美国产| 亚洲日本无吗高清不卡| 国内久久精品视频| 国产日韩欧美在线看| 国产精品美女一区二区在线观看|