在图像中,通过邻接点的相互平均可以去掉一些突然变化的点,从而过滤掉一定的噪声,达到平滑的目的,但图像有一定程度上的模糊。

本实验使用模板

1  1  1

1  1  1

1  1  1

即每一个像素的灰度都是自身和周围8个像素的平均值。

图像锐化处理的目的是使模糊的图像变得更加清晰起来,而图像模糊的实质就是图像受到平均或积分运算造成的,因此可以对图像进行逆运算(如微分)来使图像清晰化。梯度锐化是一种常用的微分锐化方法。

Sobel 初步尝试,其卷积计算核有两个,

Sx =

-1  0  1

-2  0  2

-1  0  1

Sy =

1   2   1

0   0   0

-1  -2  -1

一个对垂直边缘影响最大,一个对水平边缘影响最大。图像中每点均分别用这两个算子作卷积,取两个卷积绝对值的和。

图像中的边缘及急剧变化部分与图像高频分量有关,利用低通滤波减弱高频部分能实现图像平滑,利用高通滤波减弱低频部分能实现图像锐化。

图像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<

/* 点的定位同 2d FFT */

/* 会修改矩阵 */

/* if 参数highPass then 高通 else 低通 */

/* == radius 也通过 */

/* 成功返回 ROK */

PublicFuncZ  R32  highLowPassFilterZ( CF64 *mat, U32 lgw, U32 lgh, F64 radius, B32 highPass );

/* 在图像上使用 n * n 的模板 mat,然后 乘以 mulFactor 除以 divFactor */

/* 假设 n 为奇数 */

/* 会修改图像 */

/* 模板 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

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;

}

数字图像处理课设图像的锐化_数字图像处理上机之五:图像平滑和锐化相关推荐

  1. 数字图像处理课设图像的锐化_数字图像处理图像锐化处理.ppt

    数字图像处理图像锐化处理 4.7.2 灰度级到彩色转换 灰度级到彩色转换(例) 在HSI彩色空间的直方图均衡强度均衡处理没有改变图像的色调和饱和度值,但它的确影响了整体图像的彩色感观. 向量分量可以用 ...

  2. 数字逻辑课设(数字电子钟)

    做了快一个星期的数字逻辑课设,存手动连线,虽然年那块还没有做完 ,但是文章提供了思路,本文的重点是后面的问题解决 软件是使用proteus7 设计要求: 1).设计一个能显示日期.小时.分钟.秒的数字 ...

  3. 计算机控制系统课程设计交通灯,太原理工大学数字逻辑课设(交通灯)

    <太原理工大学数字逻辑课设(交通灯)>由会员分享,可在线阅读,更多相关<太原理工大学数字逻辑课设(交通灯)(25页珍藏版)>请在人人文库网上搜索. 1.太原理工大学计算机科学与 ...

  4. 图像处理课设(奇怪版)

    这是我做课设软件时候的经历(?) 开场白 界面设计.菜单栏 与ITK的假集成 稍微介绍一下生成exe的方法 对ITK的范例.cxx文件做了些微的修改 在一个软件中调用外部exe的方法函数(抄来的) 打 ...

  5. mysql课设的心得体会_关于数据库课设的感想

    在昨天,11.22 我完成了这次课设的报告,开心! 这次的课设真是个磨人的小妖精!!! 题目也不是很难,数据库+窗口显示 火车票售票系统(用户+管理员 订票/退票 增删改信息等操作) 最后我决定用 s ...

  6. matlab 通过矩阵变换使图像旋转平移_数字图像处理|P11 第三章 第四节 图像的几何变换...

    第四节 几何变换 图像生成过程中,由于系统本身具有非线性或拍摄角度不同,会使生成的图像产生几何失真.几何失真一般分为系统失真和非系统失真,系统失真是有规律的.能预测的:非系统失真则是随机的.例如:(1 ...

  7. 手写数字识别实现课设cnsd博客_使用Tesseract轻松实现OCR字体识别

    本教程翻译自PyImageSearch英文原文 实现效果 今天的博客文章是安装和是用Tesseract library 进行OCR识别的两章系列中的第一部分. OCR可以自动对手写或者印刷字体进行类型 ...

  8. java 图像梯度检测_数字图像处理-边缘检测

    梯度介绍 首先介绍边缘检测中用到的高等数学原理---梯度.介绍梯度,离不开方向导数. 方向导数 顾名思义,方向导数就是某个方向上的导数. 什么是方向: 函数 在这个方向上的图像: 我们知道: 函数 的 ...

  9. matlab对图像进行傅里叶变换_数字图像处理(一)—— 傅里叶变换

    1. 基本指数信号 设 与 为两个基本指数信号,其中 和 分别为连续时间域和离散时间域的角频率. 1.1 连续时间域 连续时间域中,如果满足 ,则 是周期信号,其周期为 ,: 角频率 越大,信号的振荡 ...

最新文章

  1. 分布式存储 Ceph 介绍及原理架构分享--云平台技术栈系列01
  2. 关于虚函数(多态)与继承的一道搜狗笔试题
  3. lzg_ad:使用OPENROWSET函数连接并访问远程数据库数据
  4. Python高阶函数和函数嵌套
  5. 关于养花---感叹一把
  6. [翻译]C#数据结构与算法 – 第六章BitArray类
  7. 【Java基础】List迭代并修改时出现的ConcurrentModificationException问题
  8. 流式计算storm核心组件介绍以及入门案例---跟着就能在本地跑起来的storm项目
  9. C语言逻辑填空题——审问嫌疑犯
  10. EXCEL数组公式,群里求助的问题,按条件查最大值,中位数等, 可用数组公式解决
  11. 如何用html实现文件下载
  12. 让 Code Review成为一种习惯
  13. 金融远期合约与金融期货合约
  14. 数列分块入门练习题一
  15. web项目经理手册-【7】项目经理需要铭记在心的话
  16. 电脑什么软件都没开,运行内存就占满了
  17. galaxy nexus升级包takju-jop40d的boot.img和recovery.img中ramdisk对比
  18. 华为 oj java题库_华为OJ题目:刷题
  19. Synctoy定时自动同步数据
  20. 企鹅号绑定微信公众号 问题 微信授权失败!输入的微信号和微信公众平台设置的不一致

热门文章

  1. LWIP之DP83848的配置
  2. 山西首发大数据产业发展路线图
  3. blender中如何将窗口移动到另一块屏幕上,即新开一个窗口,作用到分屏上
  4. stage,task和job的区别与划分方式
  5. 使用libusb检测USB设备插拔状态
  6. 【通话】通话多平台适配
  7. ERR_ACTION_ACCESS_UNDEFINED: Are you trying to access this.someMutation() or this.someGetter inside
  8. BUUCTF·[NCTF2019]babyRSA·wp
  9. 2022自学考试报名时间、报名条件是什么?
  10. Text Classification Algorithms: A Survey——1. Introduction引言