搜档网
当前位置:搜档网 › 图像处理opencv代码

图像处理opencv代码

图像处理opencv代码
图像处理opencv代码

#include "stdafx.h"

#include "mymfc.h"

#include "mymfcDlg.h"

#include "afxdialogex.h"

#include

#ifdef _DEBUG

#define new DEBUG_NEW

#endif

// 用于应用程序“关于”菜单项的CAboutDlg 对话框

class CAboutDlg : public CDialogEx

{

public:

CAboutDlg();

// 对话框数据

enum { IDD = IDD_ABOUTBOX };

protected:

virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持

// 实现

protected:

DECLARE_MESSAGE_MAP()

};

CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)

{

}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)

{

CDialogEx::DoDataExchange(pDX);

}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)

END_MESSAGE_MAP()

// CmymfcDlg 对话框

CmymfcDlg::CmymfcDlg(CWnd* pParent /*=NULL*/)

: CDialogEx(CmymfcDlg::IDD, pParent)

, TheImage(NULL)

, rePath(_T(""))

{

m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

}

void CmymfcDlg::DoDataExchange(CDataExchange* pDX)

{

CDialogEx::DoDataExchange(pDX);

}

BEGIN_MESSAGE_MAP(CmymfcDlg, CDialogEx)

ON_WM_SYSCOMMAND()

ON_WM_PAINT()

ON_WM_QUERYDRAGICON()

ON_BN_CLICKED(IDC_ReadImg, &CmymfcDlg::OnBnClickedReadimg)

ON_BN_CLICKED(IDC_EdgeDetect, &CmymfcDlg::OnBnClickedEdgedetect) ON_BN_CLICKED(IDC_Refresh, &CmymfcDlg::OnBnClickedRefresh)

ON_BN_CLICKED(IDC_GrayProcess, &CmymfcDlg::OnBnClickedGrayprocess) ON_BN_CLICKED(IDC_Sobel, &CmymfcDlg::OnBnClickedSobel)

ON_BN_CLICKED(IDC_Laplace, &CmymfcDlg::OnBnClickedLaplace)

ON_BN_CLICKED(IDC_FFT2, &CmymfcDlg::OnBnClickedFft2)

ON_BN_CLICKED(IDC_CImage, &CmymfcDlg::OnBnClickedCimage)

ON_BN_CLICKED(IDC_Mirror, &CmymfcDlg::OnBnClickedMirror)

ON_BN_CLICKED(IDC_CColor, &CmymfcDlg::OnBnClickedCcolor)

ON_BN_CLICKED(IDC_MedianBlur, &CmymfcDlg::OnBnClickedMedianblur) ON_BN_CLICKED(IDC_Gaussian, &CmymfcDlg::OnBnClickedGaussian)

ON_BN_CLICKED(IDC_BothSide, &CmymfcDlg::OnBnClickedBothside)

ON_BN_CLICKED(IDC_Equally, &CmymfcDlg::OnBnClickedEqually)

ON_BN_CLICKED(IDC_Corrosion, &CmymfcDlg::OnBnClickedCorrosion)

ON_BN_CLICKED(IDC_Dilate, &CmymfcDlg::OnBnClickedDilate)

END_MESSAGE_MAP()

// CmymfcDlg 消息处理程序

BOOL CmymfcDlg::OnInitDialog()

{

CDialogEx::OnInitDialog();

// 将“关于...”菜单项添加到系统菜单中。

CvSize ImgSize;

ImgSize.height = IMAGE_HEIGHT;

ImgSize.width = IMAGE_WIDTH;

TheImage = cvCreateImage( ImgSize, IPL_DEPTH_8U, IMAGE_CHANNELS );

// IDM_ABOUTBOX 必须在系统命令范围内。

ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);

ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);

if (pSysMenu != NULL)

{

BOOL bNameValid;

CString strAboutMenu;

bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);

ASSERT(bNameValid);

if (!strAboutMenu.IsEmpty())

{

pSysMenu->AppendMenu(MF_SEPARATOR);

pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);

}

}

// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动

// 执行此操作

SetIcon(m_hIcon, TRUE); // 设置大图标

SetIcon(m_hIcon, FALSE); // 设置小图标

// TODO: 在此添加额外的初始化代码

return TRUE; // 除非将焦点设置到控件,否则返回TRUE

}

void CmymfcDlg::OnSysCommand(UINT nID, LPARAM lParam)

{

if ((nID & 0xFFF0) == IDM_ABOUTBOX)

{

CAboutDlg dlgAbout;

dlgAbout.DoModal();

}

else

{

CDialogEx::OnSysCommand(nID, lParam);

}

}

// 如果向对话框添加最小化按钮,则需要下面的代码

// 来绘制该图标。对于使用文档/视图模型的MFC 应用程序,

// 这将由框架自动完成。

void CmymfcDlg::OnPaint()

{

if (IsIconic())

{

CPaintDC dc(this); // 用于绘制的设备上下文

SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc()), 0);

// 使图标在工作区矩形中居中

int cxIcon = GetSystemMetrics(SM_CXICON);

int cyIcon = GetSystemMetrics(SM_CYICON);

CRect rect;

GetClientRect(&rect);

int x = (rect.Width() - cxIcon + 1) / 2;

int y = (rect.Height() - cyIcon + 1) / 2;

// 绘制图标

dc.DrawIcon(x, y, m_hIcon);

}

else

{

CDialogEx::OnPaint();

CDialog::OnPaint();

// 重绘对话框

CDialog::UpdateWindow();

// 更新windows窗口,如果无这步调用,图片显示还会出现问题

//ShowImage( TheImage, IDC_ShowImg );

// 重绘图片函数

}

}

//当用户拖动最小化窗口时系统调用此函数取得光标

//显示。

HCURSOR CmymfcDlg::OnQueryDragIcon()

{

return static_cast(m_hIcon);

}

void CmymfcDlg::OnBnClickedReadimg() //读取图片操作

{

// TODO: 在此添加控件通知处理程序代码

// 这里用CFileDialog来选择图片

CFileDialog dlg(

TRUE, _T("*.bmp"), NULL,

OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY,

_T("All Files (*.*) |*.*|image files (*.bmp; *.jpg)|*.bmp; *.jpg ||"), NULL

);

// 打开文件对话框的标题名

dlg.m_ofn.lpstrTitle = _T("Open Image");

// 判断是否获得图片

if( dlg.DoModal() != IDOK )

return;

// 获取图片路径

CString mPath = dlg.GetPathName();

rePath = mPath;

// 读取图片

IplImage* ipl = cvLoadImage( mPath, 1 );

// 判断是否成功读取图片

if( !ipl )

return;

if( TheImage )

cvZero( TheImage );

ResizeImage( ipl );

ShowImage( TheImage,IDC_ShowImg);

cvReleaseImage( &ipl );

}

void CmymfcDlg::ShowImage(IplImage* img, UINT ID) // ID 是Picture Control控件的ID号{

// 获得显示控件的DC

CDC* pDC = GetDlgItem( ID ) ->GetDC();

// 获取HDC(设备句柄) 来进行绘图操作

HDC hDC = pDC ->GetSafeHdc();

CRect rect;

GetDlgItem(ID) ->GetClientRect( &rect );

// 求出图片控件的宽和高

int rw = rect.right - rect.left;

int rh = rect.bottom - rect.top;

// 读取图片的宽和高

int iw = img->width;

int ih = img->height;

// 使图片的显示位置正好在控件的正中

int tx = (int)(rw - iw)/2;

int ty = (int)(rh - ih)/2;

SetRect( rect, tx, ty, tx+iw, ty+ih );

// 复制图片

CvvImage cimg;

cimg.CopyOf( img );

// 将图片绘制到显示控件的指定区域内

cimg.DrawToHDC( hDC, &rect );

ReleaseDC( pDC );

}

void CmymfcDlg::ResizeImage(IplImage* img)

{

// 读取图片的宽和高

int w = img->width;

int h = img->height;

// 找出宽和高中的较大值者

int max = (w > h)? w: h;

// 计算将图片缩放到TheImage区域所需的比例

float scale = (float) ( (float) max / 256.0f );

// 缩放后图片的宽和高

int nw = (int)( w/scale );

int nh = (int)( h/scale );

// 为了将缩放后的图片存入TheImage 的正中部位,需计算图片在TheImage 左上角的期望坐标值

int tlx = (nw > nh)? 0: (int)(256-nw)/2;

int tly = (nw > nh)? (int)(256-nh)/2: 0;

// 设置TheImage 的ROI 区域,用来存入图片img

cvSetImageROI( TheImage, cvRect( tlx, tly, nw, nh) );

// 对图片img 进行缩放,并存入到TheImage 中

cvResize( img, TheImage );

// 重置TheImage 的ROI 准备读入下一幅图片

cvResetImageROI( TheImage );

}

void CmymfcDlg::OnBnClickedEdgedetect() //Canny算法的边缘检测

{

// TODO: 在此添加控件通知处理程序代码

IplImage *gray = 0, *edge = 0;

gray = cvCreateImage( cvSize(IMAGE_WIDTH, IMAGE_HEIGHT), IPL_DEPTH_8U, 1 );

edge = cvCreateImage( cvSize(IMAGE_WIDTH, IMAGE_HEIGHT), IPL_DEPTH_8U, 1 );

cvCvtColor( TheImage, gray, CV_BGR2GRAY );

cvCanny( gray, edge, 30, 100, 3 );

ShowImage( edge, IDC_ShowImg ); // 调用显示图片函数

cvReleaseImage( &gray );

cvReleaseImage( &edge );

}

void CmymfcDlg::OnBnClickedRefresh() //恢复图片

{

// TODO: 在此添加控件通知处理程序代码

//将读入的图片路径传给mPath

CString mPath = rePath;

// 读取图片、缓存到一个局部变量ipl 中

IplImage* ipl = cvLoadImage( mPath, 1 );

// 判断是否成功读取图片

if( !ipl )

return;

// 对上一幅显示的图片数据清零

if( TheImage )

cvZero( TheImage );

// 对读入的图片进行缩放,使其宽或高最大值者刚好等于256,再复制到TheImage 中ResizeImage( ipl );

// 调用显示图片函数

ShowImage( TheImage,IDC_ShowImg);

}

void CmymfcDlg::OnBnClickedGrayprocess() //灰度图像的转化

{

// TODO: 在此添加控件通知处理程序代码

IplImage *gray = 0;

gray = cvCreateImage( cvSize(IMAGE_WIDTH, IMAGE_HEIGHT), IPL_DEPTH_8U, 1 );

cvCvtColor( TheImage, gray, CV_RGB2GRAY );

ShowImage( gray, IDC_ShowImg );

//释放图片的内存空间

cvReleaseImage( &gray );

}

void CmymfcDlg::OnBnClickedSobel() //用cvSobel函数的边缘检测

{

// TODO: 在此添加控件通知处理程序代码

IplImage *gray = 0, *edge = 0;

gray = cvCreateImage( cvSize(IMAGE_WIDTH, IMAGE_HEIGHT), IPL_DEPTH_8U, 1 );

edge = cvCreateImage( cvSize(IMAGE_WIDTH, IMAGE_HEIGHT), IPL_DEPTH_8U, 1 );

cvCvtColor( TheImage, gray, CV_BGR2GRAY );

cvSobel( gray, edge, 1, 0, 3 );

ShowImage( edge, IDC_ShowImg ); // 调用显示图片函数

cvReleaseImage( &gray );

cvReleaseImage( &edge );

}

void CmymfcDlg::OnBnClickedLaplace() //用cvLaplace函数实现图像的拉普拉斯变换{

// TODO: 在此添加控件通知处理程序代码

IplImage *gray = 0, *edge = 0;

gray = cvCreateImage( cvSize(IMAGE_WIDTH, IMAGE_HEIGHT), IPL_DEPTH_8U, 1 );

edge = cvCreateImage( cvSize(IMAGE_WIDTH, IMAGE_HEIGHT), IPL_DEPTH_8U, 1 );

cvCvtColor( TheImage, gray, CV_BGR2GRAY );

cvLaplace( gray, edge, 3 );

ShowImage( edge, IDC_ShowImg ); // 调用显示图片函数

cvReleaseImage( &gray );

cvReleaseImage( &edge );

}

void CmymfcDlg::fft2(IplImage* src, IplImage* des) //傅里叶正变换方法

{

//实部、虚部

IplImage *image_Re = 0, *image_Im = 0, *Fourier = 0;

// int i, j;

image_Re = cvCreateImage(cvGetSize(src), IPL_DEPTH_64F, 1); //实部

//Imaginary part

image_Im = cvCreateImage(cvGetSize(src), IPL_DEPTH_64F, 1); //虚部

//2 channels (image_Re, image_Im)

Fourier = cvCreateImage(cvGetSize(src), IPL_DEPTH_64F, 2);

// Real part conversion from u8 to 64f (double)

cvConvertScale(src, image_Re, 1, 0);

// Imaginary part (zeros)

cvZero(image_Im);

// Join real and imaginary parts and stock them in Fourier image

cvMerge(image_Re, image_Im, 0, 0, Fourier);

// Application of the forward Fourier transform

cvDFT(Fourier, des, CV_DXT_FORWARD);

cvReleaseImage(&image_Re);

cvReleaseImage(&image_Im);

cvReleaseImage(&Fourier);

}

void CmymfcDlg::OnBnClickedFft2()

{

// TODO: 在此添加控件通知处理程序代码

IplImage *src; //源图像

IplImage *Fourier; //傅里叶系数

IplImage *dst ;

IplImage *ImageRe;

IplImage *ImageIm;

IplImage *Image;

IplImage *ImageDst;

double m,M;

double scale;

double shift;

src = cvLoadImage(rePath,0); //加载源图像,第二个参数表示将输入的图片转为单信道Fourier = cvCreateImage(cvGetSize(src),IPL_DEPTH_64F,2);

dst = cvCreateImage(cvGetSize(src),IPL_DEPTH_64F,2);

ImageRe = cvCreateImage(cvGetSize(src),IPL_DEPTH_64F,1);

ImageIm = cvCreateImage(cvGetSize(src),IPL_DEPTH_64F,1);

Image = cvCreateImage(cvGetSize(src),src->depth,src->nChannels);

ImageDst = cvCreateImage(cvGetSize(src),src->depth,src->nChannels);

fft2(src,Fourier); //傅里叶变换

fft2shift(Fourier, Image); //中心化

//cvDFT(Fourier,dst,CV_DXT_INV_SCALE);//实现傅里叶逆变换,并对结果进行缩放cvSplit(dst,ImageRe,ImageIm,0,0);

cvPow(ImageRe,ImageRe,2);

cvPow(ImageIm,ImageIm,2);

cvAdd(ImageRe,ImageIm,ImageRe,NULL);

cvPow(ImageRe,ImageRe,0.5);

cvMinMaxLoc(ImageRe,&m,&M,NULL,NULL);

scale = 255/(M - m);

shift = -m * scale;

//将shift加在ImageRe各元素按比例缩放的结果上,存储为ImageDst

//cvConvertScale(ImageRe,ImageDst,scale,shift);

cvNamedWindow("傅里叶谱",0);

cvShowImage("傅里叶谱",Image);

cvReleaseImage(&src);

cvReleaseImage(&Image);

cvReleaseImage(&ImageIm);

cvReleaseImage(&ImageRe);

cvReleaseImage(&Fourier);

cvReleaseImage(&dst);

cvReleaseImage(&ImageDst);

}

void CmymfcDlg::fft2shift(IplImage* src, IplImage* dst) //傅里叶变换

{

IplImage *image_Re = 0, *image_Im = 0;

int nRow, nCol, i, j, cy, cx;

double scale, shift, tmp13, tmp24;

image_Re = cvCreateImage(cvGetSize(src), IPL_DEPTH_64F, 1);

//Imaginary part

image_Im = cvCreateImage(cvGetSize(src), IPL_DEPTH_64F, 1);

cvSplit( src, image_Re, image_Im, 0, 0 );

// Compute the magnitude of the spectrum Mag = sqrt(Re^2 + Im^2)

//计算傅里叶谱

cvPow( image_Re, image_Re, 2.0);

cvPow( image_Im, image_Im, 2.0);

cvAdd( image_Re, image_Im, image_Re);

cvPow( image_Re, image_Re, 0.5 );

//对数变换以增强灰度级细节(这种变换使以窄带低灰度输入图像值映射

// Compute log(1 + Mag);

cvAddS( image_Re, cvScalar(1.0), image_Re ); // 1 + Mag

cvLog( image_Re, image_Re ); // log(1 + Mag)

//Rearrange the quadrants of Fourier image so that the origin is at the image center nRow = src->height;

nCol = src->width;

cy = nRow/2; // image center

cx = nCol/2;

//进行中心变换

for( j = 0; j < cy; j++ ){

for( i = 0; i < cx; i++ ){

//中心化,将整体份成四块进行对角交换

tmp13 = CV_IMAGE_ELEM( image_Re, double, j, i);

CV_IMAGE_ELEM( image_Re, double, j, i) = CV_IMAGE_ELEM(

image_Re, double, j+cy, i+cx);

CV_IMAGE_ELEM( image_Re, double, j+cy, i+cx) = tmp13;

tmp24 = CV_IMAGE_ELEM( image_Re, double, j, i+cx);

CV_IMAGE_ELEM( image_Re, double, j, i+cx) =

CV_IMAGE_ELEM( image_Re, double, j+cy, i);

CV_IMAGE_ELEM( image_Re, double, j+cy, i) = tmp24;

}

}

//归一化处理将矩阵的元素值归一为[0,255]

//[(f(x,y)-minVal)/(maxVal-minVal)]*255

double minVal = 0, maxVal = 0;

// Localize minimum and maximum values

cvMinMaxLoc( image_Re, &minVal, &maxVal );

// Normalize image (0 - 255) to be observed as an u8 image

scale = 255/(maxVal - minVal);

shift = -minVal * scale;

cvConvertScale(image_Re, dst, scale, shift);

cvReleaseImage(&image_Re);

cvReleaseImage(&image_Im);

}

void CmymfcDlg::OnBnClickedCimage() //图片的反转

{

// TODO: 在此添加控件通知处理程序代码

IplImage * cImage = 0;

cImage = cvCloneImage(TheImage); //这里用克隆函数将原图片复制给cImage

//利用翻转函数cvFlip()将cImage反转

cvFlip(cImage,NULL,0);

ShowImage(cImage,IDC_ShowImg);

cvReleaseImage(&cImage);

}

void CmymfcDlg::OnBnClickedMirror() //图像的镜像

{

// TODO: 在此添加控件通知处理程序代码

IplImage * cImage = 0;

cImage = cvCloneImage(TheImage); //这里用克隆函数将原图片复制给cImage

//利用翻转函数cvFlip()将cImage反转

cvFlip(cImage,NULL,1);

ShowImage(cImage,IDC_ShowImg);

cvReleaseImage(&cImage);

}

void CmymfcDlg::OnBnClickedCcolor() //图像的反色

{

// TODO: 在此添加控件通知处理程序代码

IplImage * cImage = 0;

cImage = cvCloneImage(TheImage); //这里用克隆函数将原图片复制给cImage

//利用函数cvNot()将cImage每个像素点取反

cvNot(TheImage,cImage);

ShowImage(cImage,IDC_ShowImg);

cvReleaseImage(&cImage);

}

void CmymfcDlg::OnBnClickedMedianblur() //非线性滤波之中值滤波

{

// TODO: 在此添加控件通知处理程序代码

//灰度原始图像

IplImage *gray = 0;

gray = cvCreateImage( cvSize(IMAGE_WIDTH, IMAGE_HEIGHT), IPL_DEPTH_8U, 1 );

cvCvtColor( TheImage, gray, CV_RGB2GRAY );

IplImage * dstImage = 0;

dstImage = cvCloneImage(gray); //这里用克隆函数将sreImage图片复制给dstImage cvSmooth(gray,dstImage,CV_MEDIAN,5,5);

ShowImage(dstImage,IDC_ShowImg);

cvReleaseImage(&gray);

cvReleaseImage(&dstImage);

}

void CmymfcDlg::OnBnClickedGaussian() //高斯滤波

{

// TODO: 在此添加控件通知处理程序代码

//灰度原始图像

IplImage *gray = 0;

gray = cvCreateImage( cvSize(IMAGE_WIDTH, IMAGE_HEIGHT), IPL_DEPTH_8U, 1 );

cvCvtColor( TheImage, gray, CV_RGB2GRAY );

IplImage * dstImage = 0;

dstImage = cvCloneImage(gray); //这里用克隆函数将sreImage图片复制给dstImage cvSmooth(gray,dstImage,CV_GAUSSIAN,5,5);

ShowImage(dstImage,IDC_ShowImg);

cvReleaseImage(&gray);

cvReleaseImage(&dstImage);

}

void CmymfcDlg::OnBnClickedBothside() //双边滤波

{

// TODO: 在此添加控件通知处理程序代码

//灰度原始图像

IplImage *gray = 0;

gray = cvCreateImage( cvSize(IMAGE_WIDTH, IMAGE_HEIGHT), IPL_DEPTH_8U, 1 );

cvCvtColor( TheImage, gray, CV_RGB2GRAY );

IplImage * dstImage = 0;

dstImage = cvCloneImage(gray); //这里用克隆函数将sreImage图片复制给dstImage cvSmooth(gray,dstImage,CV_BILATERAL,1,150,240,480);

ShowImage(dstImage,IDC_ShowImg);

cvReleaseImage(&gray);

cvReleaseImage(&dstImage);

}

void CmymfcDlg::OnBnClickedEqually() //图片的均值滤波

{

// TODO: 在此添加控件通知处理程序代码

//灰度原始图像

IplImage *gray = 0;

gray = cvCreateImage( cvSize(IMAGE_WIDTH, IMAGE_HEIGHT), IPL_DEPTH_8U, 1 );

cvCvtColor( TheImage, gray, CV_RGB2GRAY );

IplImage * dstImage = 0;

dstImage = cvCloneImage(gray); //这里用克隆函数将sreImage图片复制给dstImage cvSmooth(gray,dstImage,CV_BLUR,3,3);

ShowImage(dstImage,IDC_ShowImg);

cvReleaseImage(&gray);

cvReleaseImage(&dstImage);

}

void CmymfcDlg::OnBnClickedCorrosion() //图片的腐蚀

{

// TODO: 在此添加控件通知处理程序代码

//灰度原始图像

IplImage *gray = 0;

gray = cvCreateImage( cvSize(IMAGE_WIDTH, IMAGE_HEIGHT), IPL_DEPTH_8U, 1 );

cvCvtColor( TheImage, gray, CV_RGB2GRAY );

IplImage * dstImage = 0;

dstImage = cvCloneImage(gray); //这里用克隆函数将sreImage图片复制给dstImage cvErode(gray,dstImage,0,1); //使用cvErode()函数实现图片的腐蚀

ShowImage(dstImage,IDC_ShowImg);

cvReleaseImage(&gray);

cvReleaseImage(&dstImage);

}

void CmymfcDlg::OnBnClickedDilate() //图片的膨胀

{

// TODO: 在此添加控件通知处理程序代码

//灰度原始图像

IplImage *gray = 0;

gray = cvCreateImage( cvSize(IMAGE_WIDTH, IMAGE_HEIGHT), IPL_DEPTH_8U, 1 );

cvCvtColor( TheImage, gray, CV_RGB2GRAY );

IplImage * dstImage = 0;

dstImage = cvCloneImage(gray); //这里用克隆函数将sreImage图片复制给dstImage cvDilate(gray,dstImage,0,1); //使用cvDilate()函数实现图片的膨胀

ShowImage(dstImage,IDC_ShowImg);

cvReleaseImage(&gray);

cvReleaseImage(&dstImage);

}

matlab程序代码 关于医学图像分割处理 边缘检测 阈值法

matlab程序代码关于医学图像分割处理边缘检测阈值法 图像分割程序:% This is a program for extracting objects from an image. Written for vehicle number plate segmentation and extraction % Authors : Jeny Rajan, Chandrashekar P S % U can use attached test image for testing % input - give the image file name as input. eg :- car3.jpg clc; clear all; k=input('Enter the file name','s'); % input image; color image im=imread(k); im1=rgb2gray(im); im1=medfilt2(im1,[3 3]); %Median filtering the image to remove noise% BW = edge(im1,'sobel'); %finding edges [imx,imy]=size(BW); msk=[0 0 0 0 0; 0 1 1 1 0; 0 1 1 1 0; 0 1 1 1 0; 0 0 0 0 0;]; B=conv2(double(BW),double(msk)); %Smoothing image to reduce the number of connected components L = bwlabel(B,8);% Calculating connected components mx=max(max(L)) % There will be mx connected components.Here U can give a value between 1 and mx for L or in a loop you can extract all connected components % If you are using the attached car image, by giving 17,18,19,22,27,28 to L you can extract the number plate completely. [r,c] = find(L==17); rc = [r c];

图像处理opencv代码

#include "stdafx.h" #include "mymfc.h" #include "mymfcDlg.h" #include "afxdialogex.h" #include #ifdef _DEBUG #define new DEBUG_NEW #endif // 用于应用程序“关于”菜单项的 CAboutDlg 对话框 class CAboutDlg : public CDialogEx { public: CAboutDlg(); // 对话框数据 enum { IDD = IDD_ABOUTBOX }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 // 实现 protected: DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx) END_MESSAGE_MAP() // CmymfcDlg 对话框

CmymfcDlg::CmymfcDlg(CWnd* pParent /*=NULL*/) : CDialogEx(CmymfcDlg::IDD, pParent) , TheImage(NULL) , rePath(_T("")) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CmymfcDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CmymfcDlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_ReadImg, &CmymfcDlg::OnBnClickedReadimg) ON_BN_CLICKED(IDC_EdgeDetect, &CmymfcDlg::OnBnClickedEdgedetect) ON_BN_CLICKED(IDC_Refresh, &CmymfcDlg::OnBnClickedRefresh) ON_BN_CLICKED(IDC_GrayProcess, &CmymfcDlg::OnBnClickedGrayprocess) ON_BN_CLICKED(IDC_Sobel, &CmymfcDlg::OnBnClickedSobel) ON_BN_CLICKED(IDC_Laplace, &CmymfcDlg::OnBnClickedLaplace) ON_BN_CLICKED(IDC_FFT2, &CmymfcDlg::OnBnClickedFft2) ON_BN_CLICKED(IDC_CImage, &CmymfcDlg::OnBnClickedCimage) ON_BN_CLICKED(IDC_Mirror, &CmymfcDlg::OnBnClickedMirror) ON_BN_CLICKED(IDC_CColor, &CmymfcDlg::OnBnClickedCcolor) ON_BN_CLICKED(IDC_MedianBlur, &CmymfcDlg::OnBnClickedMedianblur) ON_BN_CLICKED(IDC_Gaussian, &CmymfcDlg::OnBnClickedGaussian) ON_BN_CLICKED(IDC_BothSide, &CmymfcDlg::OnBnClickedBothside) ON_BN_CLICKED(IDC_Equally, &CmymfcDlg::OnBnClickedEqually) ON_BN_CLICKED(IDC_Corrosion, &CmymfcDlg::OnBnClickedCorrosion) ON_BN_CLICKED(IDC_Dilate, &CmymfcDlg::OnBnClickedDilate) END_MESSAGE_MAP() // CmymfcDlg 消息处理程序 BOOL CmymfcDlg::OnInitDialog() { CDialogEx::OnInitDialog();

基于OpenCV识别库的面部图像识别系统的设计

基于OpenCV识别库的面部图像识别系统的设计 本系统采用J2EE技术并以OpenCV开源计算机视觉库技术为基础,实现一套具有身份验证功能的面部图像识别信息管理系统。系统使用MySQL数据库提供数据支撑,依托于J2EE的稳定性和Java平台的可移植性使得本系统可以在各个操作系统平台中运行,同时提供在互联网中使用面部识别技术的一套较为完备的解决方案。 标签:OpenCV;人脸识别;生物学特征 引言 随着信息技术的飞速发展以及互联网的深入普及,越来越多的行业和领域使用信息技术产品以提高工作效率和管理水平。但是由于人们隐私信息的保护意识薄弱,出现了许多信息安全的问题。在人们对于信息安全越来越重视的情况下,许多技术被应用到信息安全领域中来。较为先进的技术有虹膜识别技术、遗传基因识别技术以及指纹识别技术等。而论文采用的是当前热点的面部图像识别技术。 1 系统实现算法及功能分析 1.1 面部图像的生物学特征模型的建立 本系统是利用面部图形的生物学特征来识别不同的人。由于每个人的面部图像都有各自的特征但又具有一定的通性,需要应用生物学中相关知识加以解决。可以利用已有的生物学测量手段以及现有的算法构建人的面部图像生物学特征模型(简称:面部模型),并应用于系统中,面部模型的建立为面部图像识别的功能提供实现依据。 1.2 知识特征库及面部识别引擎的建立 在前述面部模型建立完成后,需要建立相应的知识库以及面部识别引擎方可进行身份的识别。可经过大量数据的采集和分析后建立知识库,并根据知识库的特点建立相应的识别引擎。此识别引擎对外开放,在本系统中提供其它外来程序的调用接口,其它系统能够通过本接口实现识别引擎的调用实现对于面部图形的识别,从而达到识别引擎的可复用性。在技术条件允许的情况下,提供知识库的智能训练以及半自动构建支持。 1.3 面部图像的采集与预处理 本系统中采用了预留API接口,利用USB图形捕获设备采集数据图像。经过USB设备的捕获,使用JMF(Java Media Framework)来处理已捕获的图像数据,对捕获的图像进行面部图行检测和实时定位跟踪。

图像分割程序设计汇总

******************* 实践教学 ******************* 兰州理工大学 计算机与通信学院 2012年秋季学期 图像处理综合训练 题目:图像分割程序设计 专业班级: 姓名: 学号: 指导教师: 成绩:

目录 摘要 (1) 一、前言 (2) 二、算法分析与描述 (3) 三、详细设计过程 (5) 四、调试过程中出现的问题及相应解决办法 (8) 五、程序运行截图及其说明 (8) 六、简单操作手册 (12) 设计总结 (15) 参考资料 (16) 致谢 (17) 附录 (18)

摘要 图像分割就是从图像中将某个特定区域与其他部分进行分离并提取出来的处理 通常又称之为图像的二值化处理。图像分割就是把图像分成若干个特定的、具有独特性质的区域并提出感兴趣目标的技术和过程。它是由图像处理到图像分析的关键步骤。现有的图像分割方法主要分以下几类:基于阈值的分割方法、基于区域的分割方法、基于边缘的分割方法以及基于特定理论的分割方法等。近年来,研究人员不断改进原有的图像分割方法并把其它学科的一些新理论和新方法用于图像分割,提出了不少新的分割方法。 关键词:图像分割;阈值;二值化;

一、前言 图形图像处理的应用领域涉及人类生活和工作的各个方面,它是从60年代以来随计算机的技术和VLSI的发展而产生、发展和不断成熟起来的一个新技术领域理论上和实际应用上都并取得了巨大的成就。数字图像处理与模拟图像处理的根本不同在于,它不会因图像的存储、传输或复制等一系列变换操作而导致图像质量的退化,所以图形图像的处理在我们的生活中又很重要的作用。在对图像的研究和应用中,人们往往只对图像中的某些部分感兴趣。这些部分通常称为目标或前景,它们一般对应图像中特定的、具体独特性质的区域。为了辨识和分析目标,需要将它们分别提取出来,在此基础上才有可能对目标进一步利用。图像分割就是指把图像分成各具特性的区域并提取出感兴趣的目标的技术和过程。在图象分析中,通常需将所关心的目标从图象中提取出来,即图象的分割。图象分割在图象分析,图象识别,图象检测等方面占有非常重要的位置。

opencv函数目录-Cv图像处理

目录 1 梯度、边缘和角点 1.1 Sobel 1.2 Laplace 1.3 Canny 1.4 PreCornerDetect 1.5 CornerEigenValsAndVecs 1.6 CornerMinEigenVal 1.7 CornerHarris 1.8 FindCornerSubPix 1.9 GoodFeaturesToTrack 2 采样、插值和几何变换 2.1 InitLineIterator 2.2 SampleLine 2.3 GetRectSubPix 2.4 GetQuadrangleSubPix 2.5 Resize 2.6 WarpAffine 2.7 GetAffineTransform 2.8 2DRotationMatrix 2.9 WarpPerspective 2.10 WarpPerspectiveQMatrix 2.11 GetPerspectiveTransform 2.12 Remap 2.13 LogPolar 3 形态学操作 3.1 CreateStructuringElementEx 3.2 ReleaseStructuringElement 3.3 Erode 3.4 Dilate 3.5 MorphologyEx 4 滤波器与色彩空间变换 4.1 Smooth 4.2 Filter2D 4.3 CopyMakeBorder 4.4 Integral 4.5 CvtColor 4.6 Threshold 4.7 AdaptiveThreshold 5 金字塔及其应用 5.1 PyrDown 5.2 PyrUp 6 连接部件 6.1 CvConnectedComp

部分图像分割的方法(matlab)

部分图像分割的方法(matlab)

大津法: function y1=OTSU(image,th_set) image=imread('color1.bmp'); gray=rgb2gray(image);%原图像的灰度图 low_high=stretchlim(gray);%增强图像,似乎也不是一定需要gray=imadjust(gray,low_high,[]); % subplot(224);imshow(gray);title('after adjust'); count=imhist(gray); [r,t]=size(gray); n=r*t; l=256; count=count/n;%各级灰度出现的概率 for i=2:l if count(i)~=0 st=i-1; break end end %以上循环语句实现寻找出现概率不为0的最小灰度值 for i=l:-1:1 if count(i)~=0; nd=i-1; break end end %实现找出出现概率不为0的最大灰度值 f=count(st+1:nd+1); p=st;q=nd-st;%p和分别是灰度的起始和结束值 u=0; for i=1:q; u=u+f(i)*(p+i-1); ua(i)=u; end

程序二: clc; clear; cd 'D:\My Documents\MATLAB' time = now; I = imread('qr4.bmp'); figure(1),imshow(I),title('p1_1.bmp'); % show the picture I2 = rgb2gray(I); figure(2),imshow(I2),title('I2.bmp'); %?D?μ??2¨ J = medfilt2(I2); figure(3),imshow(J); imwrite(J,'J.bmp'); [M N] = size(J); J1 = J(1:M/2,1:fix(N/2)); J2 = J(1:M/2,fix(N/2)+1:N); J3 = J(M/2+1:M, 1:fix( N/2)); J4 = J(M/2+1:M, fix(N/2)+1:N); % figure(4), img = J1; T1 = test_gray2bw( img ); % figure(5), img = J2; T2 = test_gray2bw( img ); % figure(6), img = J3; T3 = test_gray2bw( img ); % figure(7), img = J4; T4 = test_gray2bw( img ); T = [T1,T2;T3,T4]; figure,imshow(T) % T1 = edge(T,'sobel'); % figure,imshow(T1); % BW = edge(T,'sobel'); % f igure,imshow(BW); function [bw_img] = test_gray2bw( img ) %大津法 [row_img col_img ] = size( img ) all_pix = row_img * col_img % get probability of each pixel(????). count_pix = zeros(1,256) % pro_pix = [] for i = 1 : 1 : row_img for j = 1 : 1 : col_img count_pix(1,img(i,j)+1) = count_pix(1,img(i,j)+1) + 1 %í3??′?êy end en d pro_pix = count_pix / all_pix % choose k value; max_kesi = -1 T = 0 for k = 1 : 1 : while( i <= k ) wa = wa + pro_pix(1,i+1) %?°k??i£?????????μ??ò?è???ê£????êoí ua = ua + i * pro_pix(1,i+1) i = i + 1 end

两个matlab实现最大熵法图像分割程序

%两个程序,亲测可用 clear all a=imread('moon.tif'); figure,imshow(a) count=imhist(a); [m,n]=size(a); N=m*n; L=256; count=count/N;%%每一个像素的分布概率 count for i=1:L if count(i)~=0 st=i-1; break; end end st for i=L:-1:1 if count(i)~=0 nd=i-1; break; end end nd f=count(st+1:nd+1); %f是每个灰度出现的概率 size(f) E=[]; for Th=st:nd-1 %%%设定初始分割阈值为Th av1=0; av2=0; Pth=sum(count(1:Th+1)); %%%第一类的平均相对熵为 for i=0:Th av1=av1-count(i+1)/Pth*log(count(i+1)/Pth+0.00001); end %%%第二类的平均相对熵为 for i=Th+1:L-1 av2=av2-count(i+1)/(1-Pth)*log(count(i+1)/(1-Pth)+0.00001); end E(Th-st+1)=av1+av2; end position=find(E==(max(E))); th=st+position-1

for i=1:m for j=1:n if a(i,j)>th a(i,j)=255; else a(i,j)=0; end end end figure,imshow(a); %%%%%%%%%%%%%%%%%%%%%2-d 最大熵法(递推方法) %%%%%%%%%%% clear all; clc; tic a=imread('trial2_2.tiff'); figure,imshow(a); a0=double(a); [m,n]=size(a); h=1; a1=zeros(m,n); % 计算平均领域灰度的一维灰度直方图 for i=1:m for j=1:n for k=-h:h for w=-h:h; p=i+k; q=j+w; if (p<=0)|( p>m) p=i; end if (q<=0)|(q>n) q=j; end a1(i,j)=a0(p,q)+a1(i,j); end end a2(i,j)=uint8(1/9*a1(i,j)); end

图像管理方案计划opencv代码

/. #include "stdafx.h" #include "mymfc.h" #include "mymfcDlg.h" #include "afxdialogex.h" #include #ifdef _DEBUG #define new DEBUG_NEW #endif // 用于应用程序“关于”菜单项的CAboutDlg 对话框 class CAboutDlg : public CDialogEx { public: CAboutDlg(); // 对话框数据 enum { IDD = IDD_ABOUTBOX }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 // 实现 protected: DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx) END_MESSAGE_MAP() // CmymfcDlg 对话框

CmymfcDlg::CmymfcDlg(CWnd* pParent /*=NULL*/) : CDialogEx(CmymfcDlg::IDD, pParent) , TheImage(NULL) , rePath(_T("")) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CmymfcDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CmymfcDlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_ReadImg, &CmymfcDlg::OnBnClickedReadimg) ON_BN_CLICKED(IDC_EdgeDetect, &CmymfcDlg::OnBnClickedEdgedetect) ON_BN_CLICKED(IDC_Refresh, &CmymfcDlg::OnBnClickedRefresh) ON_BN_CLICKED(IDC_GrayProcess, &CmymfcDlg::OnBnClickedGrayprocess) ON_BN_CLICKED(IDC_Sobel, &CmymfcDlg::OnBnClickedSobel) ON_BN_CLICKED(IDC_Laplace, &CmymfcDlg::OnBnClickedLaplace) ON_BN_CLICKED(IDC_FFT2, &CmymfcDlg::OnBnClickedFft2) ON_BN_CLICKED(IDC_CImage, &CmymfcDlg::OnBnClickedCimage) ON_BN_CLICKED(IDC_Mirror, &CmymfcDlg::OnBnClickedMirror) ON_BN_CLICKED(IDC_CColor, &CmymfcDlg::OnBnClickedCcolor) ON_BN_CLICKED(IDC_MedianBlur, &CmymfcDlg::OnBnClickedMedianblur) ON_BN_CLICKED(IDC_Gaussian, &CmymfcDlg::OnBnClickedGaussian) ON_BN_CLICKED(IDC_BothSide, &CmymfcDlg::OnBnClickedBothside) ON_BN_CLICKED(IDC_Equally, &CmymfcDlg::OnBnClickedEqually) ON_BN_CLICKED(IDC_Corrosion, &CmymfcDlg::OnBnClickedCorrosion) ON_BN_CLICKED(IDC_Dilate, &CmymfcDlg::OnBnClickedDilate) END_MESSAGE_MAP() // CmymfcDlg 消息处理程序 BOOL CmymfcDlg::OnInitDialog() { CDialogEx::OnInitDialog();

基于OpenCv的图像识别

基于2DPCA的人脸识别算法研究 摘要 人脸识别技术是对图像和视频中的人脸进行检测和定位的一门模式识别技术,包含位置、大小、个数和形态等人脸图像的所有信息。由于近年来计算机技术的飞速发展,为人脸识别技术的广泛应用提供了可能,所以图像处理技术被广泛应用了各种领域。该技术具有广阔的前景,如今已有大量的研究人员专注于人脸识别技术的开发。本文的主要工作内容如下: 1)介绍了人脸识别技术的基础知识,包括该技术的应用、背景、研究方向以及 目前研究该技术的困难,并对人脸识别系统的运行过程以及运行平台作了简单的介绍。 2)预处理工作是在原始0RL人脸库上进行的。在图像的预处理阶段,经过了图 象的颜色处理,图像的几何归一化,图像的均衡化和图象的灰度归一化四个过程。所有人脸图像通过上述处理后,就可以在一定程度上减小光照、背景等一些外在因素的不利影响。 3)介绍了目前主流的一些人脸检测算法,本文采用并详细叙述了Adaboost人脸 检测算法。Adaboost算法首先需要创建人脸图像的训练样本,再通过对样本的训练,得到的级联分类器就可以对人脸进行检测。 4)本文介绍了基于PCA算法的人脸特征点提取,并在PCA算法的基础上应用了 改进型的2DPCA算法,对两者的性能进行了对比,得出后者的准确度和实时性均大于前者,最后将Adaboost人脸检测算法和2DPCA算法结合,不仅能大幅度降低识别时间,而且还相互补充,有效的提高了识别率。 关键词:人脸识别 2DPCA 特征提取人脸检测

2DPCA Face Recognition Algorithm Based on The Research Abstract:Face recognition is a technology to detect and locate human face in an image or video streams,Including location, size, shape, number and other information of human face in an image or video streams.Due to the rapid development of computer operation speed makes the image processing technology has been widely applied in many fields in recent years. This paper's work has the following several aspects: 1)Explained the background, research scope and method of face recognition,and introduced the theoretical method of face recognition field in general. 2)The pretreatments work is based on the original ORL face database. In the image preprocessing stage, there are the color of the image processing, image geometric normalization, image equalization and image gray scale normalization four parts. After united processing, the face image is standard, which can eliminate the adverse effects of some external factors. 3)All kinds of face detection algorithm is introduced, and detailed describing the Adaboost algorithm for face detection. Through the Adaboost algorithm to create a training sample,then Training the samples of face image,and obtaining the cascade classifier to detect human face. 4)This paper introduces the facial feature points extraction based on PCA ,and 2DPCA is used on the basis of the PCA as a improved algorithm.Performance is compared between the two, it is concluds that the real time and accuracy of the latter is greater than the former.Finally the Adaboost face detection algorithm and 2DPCA are combined, which not only can greatly reduce the recognition time, but also complement each other, effectively improve the recognition rate. Key words:Face recognition 2DPCA Feature extraction Face detection

基于opencv对图像的预处理

基于opencv 对图像的预处理 1.问题描述 本次设计是基于opencv 结合c++语言实现的对图像的预处理,opencv 是用于开发实时的图像处理、计算机视觉及模式识别程序;其中图像的预处理也就是利用opencv 对图像进行简单的编辑操作;例如对图像的对比度、亮度、饱和度进行调节,同时还可以对图像进行缩放和旋转,这些都是图像预处理简单的处理方法;首先通过opencv 加载一幅原型图像,显示出来;设置五个滑动控制按钮,当拖动按钮时,对比度、亮度、饱和度的大小也会随之改变,也可以通过同样的方式调节缩放的比例和旋转的角度,来控制图像,对图像进行处理,显示出符合调节要求的图像,进行对比观察他们的之间的变化。 2.模块划分 此次设计的模块分为五个模块,滑动控制模块、对比度和亮度调节模块、饱和度调节模块、缩放调节模块、旋转调节模块,他们之间的关系如下所示: 图一、各个模块关系图 调用 调用 调用 调用 滑动控制模块 对比度和亮度调节模块 饱和度调节模块 缩放调节模块 旋转调节模块

滑动控制模块处于主函数之中,是整个设计的核心部分,通过createTrackbar创建五个滑动控制按钮并且调用每个模块实现对图像相应的调节。 3.算法设计 (1)滑动控制: 滑动控制是整个设计的核心部分,通过创建滑动控制按钮调节大小来改变相应的数据,进行调用函数实现对图像的编辑,滑动控制是利用createTrackbar(),函数中包括了滑动控制的名称,滑动控制显示在什么窗口上,滑动变量的地址和它调节的最大围,以及每个控制按钮应该调用什么函数实现什么功能; (2)对比度和亮度的调节: 对比度和亮度的调节的原理是依照线性理论,它的公式如下所示:g(x)=a* f(x) +b,其中f(x)表示源图像的像素,g(x)表示输出图像的像素,参数a(需要满足a>0)被称为增益(gain),常常被用来控制图像的对比度,参数b通常被称为偏置(bias),常常被用来控制图像的亮度; (3)饱和度的调节: 饱和度调节利用cvCvtColor( src_image, dst_image, CV_BGR2HSV )将RGB 颜色空间转换为HSV颜色空间,其中“H=Hue”表示色调,“S=Saturation”表示饱和度,“V=Value ”表示纯度;所以饱和度的调节只需要调节S的大小,H 和V的值不需要做任何的改变; (4)旋转的调节: 旋转是以某参考点为圆心,将图像的个点(x,y)围绕圆心转动一个逆时针角度θ,变为新的坐标(x1,y1),x1=rcos(α+θ),y1=rsin(α+θ),其中r是图像的极径,α是图像与水平的坐标的角度的大小; (5)缩放的调节: 首先得到源图像的宽度x和高度y,变换后新的图像的宽度和高度分别为x1和y1,x1=x*f,y1=y*f,其中f是缩放因子; 4.函数功能描述 (1)主函数main()用来设置滑动控制按钮,当鼠标拖动按钮可以得到相应的数据大小,实现手动控制的功能,当鼠标拖动对比度和亮度调节是,主函数调用

部分图像分割的方法(matlab)

大津法: function y1=OTSU(image,th_set) image=imread('color1.bmp'); gray=rgb2gray(image);%原图像的灰度图 low_high=stretchlim(gray);%增强图像,似乎也不是一定需要gray=imadjust(gray,low_high,[]); % subplot(224);imshow(gray);title('after adjust'); count=imhist(gray); [r,t]=size(gray); n=r*t; l=256; count=count/n;%各级灰度出现的概率 for i=2:l if count(i)~=0 st=i-1; break end end %以上循环语句实现寻找出现概率不为0的最小灰度值 for i=l:-1:1 if count(i)~=0; nd=i-1; break end end %实现找出出现概率不为0的最大灰度值 f=count(st+1:nd+1); p=st;q=nd-st;%p和分别是灰度的起始和结束值 u=0; for i=1:q; u=u+f(i)*(p+i-1); ua(i)=u; end

%计算图像的平均灰度值 for i=1:q; w(i)=sum(f(1:i)); end %计算出选择不同k的时候,A区域的概率 d=(u*w-ua).^2./(w.*(1-w));%求出不同k值时类间方差[y,tp]=max(d);%求出最大方差对应的灰度级 th=tp+p; if thth) y1(i,j)=x1(i,j); else y1(i,j)=0; end end end %上面一段代码实现分割 % figure,imshow(y1); % title('灰度门限分割的图像');

OpenCV最基础的图像处理的例子

?什么是OpenCV ?开源C/C++计算机视觉库. ?面向实时应用进行优化. ?跨操作系统/硬件/窗口管理器. ?通用图像/视频载入、存储和获取. ?由中、高层API构成. ?为Intel?公司的Integrated Performance Primitives (IPP) 提供了透明接口. ?特性: ?图像数据操作(分配,释放, 复制, 设定, 转换). ?图像与视频I/O (基于文件/摄像头输入, 图像/视频文件输出). ?矩阵与向量操作与线性代数计算(相乘, 求解, 特征值, 奇异值分解SVD). ?各种动态数据结构(列表, 队列, 集, 树, 图). ?基本图像处理(滤波, 边缘检测, 角点检测, 采样与插值, 色彩转换, 形态操作, 直方图, 图像金字塔). ?结构分析(连接成分, 轮廓处理, 距离转换, 模板匹配, Hough转换, 多边形近似, 线性拟合, 椭圆拟合, Delaunay三角化). ?摄像头标定 (寻找并跟踪标定模板, 标定, 基础矩阵估计, homography估计, 立体匹配). ?动作分析(光流, 动作分割, 跟踪). ?对象辨识 (特征方法, 隐马可夫链模型HMM). ?基本GUI(显示图像/视频, 键盘鼠标操作, 滚动条). ?图像标识 (直线, 圆锥, 多边形, 文本绘图) ?OpenCV 模块: ?cv - OpenCV 主要函数. ?cvaux - 辅助(实验性) OpenCV 函数. ?cxcore - 数据结构与线性代数算法. ?highgui - GUI函数. 资料链接 ?参考手册: ?/docs/index.htm ?网络资源: ?官方网页: https://www.sodocs.net/doc/416503848.html,/technology/computing/opencv/?软件下载: https://www.sodocs.net/doc/416503848.html,/projects/opencvlibrary/ ?书籍: ?Open Source Computer Vision Library by Gary R. Bradski, Vadim Pisarevsky, and Jean-Yves Bouguet, Springer, 1st ed. (June, 2006). ?视频处理例程(位于/samples/c/目录中): ?色彩跟踪: camshiftdemo ?点跟踪: lkdemo

图像分割 实验报告

实验报告 课程名称医学图像处理 实验名称图像分割 专业班级 姓名 学号 实验日期 实验地点 2015—2016学年度第 2 学期

050100150200250 图1 原图 3 阈值分割后的二值图像分析:手动阈值分割的阈值是取直方图中双峰的谷底的灰度值作为阈值,若有多个双峰谷底,则取第一个作为阈值。本题的阈值取

%例2 迭代阈值分割 f=imread('cameraman.tif'); %读入图像 subplot(1,2,1);imshow(f); %创建一个一行二列的窗口,在第一个窗口显示图像title('原始图像'); %标注标题 f=double(f); %转换位双精度 T=(min(f(:))+max(f(:)))/2; %设定初始阈值 done=false; %定义开关变量,用于控制循环次数 i=0; %迭代,初始值i=0 while~done %while ~done 是循环条件,~ 是“非”的意思,此 处done = 0; 说明是无限循环,循环体里面应该还 有循环退出条件,否则就循环到死了; r1=find(f<=T); %按前次结果对t进行二次分 r2=find(f>T); %按前次结果重新对t进行二次分 Tnew=(mean(f(r1))+mean(f(r2)))/2; %新阈值两个范围内像素平均值和的一半done=abs(Tnew-T)<1; %设定两次阈值的比较,当满足小于1时,停止循环, 1是自己指定的参数 T=Tnew; %把Tnw的值赋给T i=i+1; %执行循坏,每次都加1 end f(r1)=0; %把小于初始阈值的变成黑的 f(r2)=1; %把大于初始阈值的变成白的 subplot(1,2,2); %创建一个一行二列的窗口,在第二个窗口显示图像imshow(f); %显示图像 title('迭代阈值二值化图像'); %标注标题 图4原始图像图5迭代阈值二值化图像 分析:本题是迭代阈值二值化分割,步骤是:1.选定初始阈值,即原图大小取平均;2.用初阈值进行二值分割;3.目标灰度值平均背景都取平均;4.迭代生成阈值,直到两次阈值的灰 度变化不超过1,则稳定;5.输出迭代结果。

opencv最基础的图像处理

openCV——几个实用函数 2010年12月20日星期一 09:18 1. cvSmooth:各种方法的图像平滑 void cvSmooth( const CvArr* src, CvArr* dst, int smoothtype=CV_GAUSSIAN, int param1=3, int param2=0, double param3=0 ); src 输入图像. dst 输出图像. smoothtype 平滑方法: . CV_BLUR_NO_SCALE (简单不带尺度变换的模糊) - 对每个象素的param1×param2 领域求和。如果邻域大小是变化的,可以事先利用函数cvIntegral 计算积分图像。 . CV_BLUR (simple blur) - 对每个象素param1×param2邻域求和并做尺度变换 1/(param1.param2). . CV_GAUSSIAN (gaussian blur) - 对图像进行核大小为 param1×param2 的高斯卷积 . CV_MEDIAN (median blur) - 对图像进行核大小为 param1×param1 的中值滤波 (i.e. 邻域是方的). . CV_BILATERAL (双向滤波) - 应用双向 3x3 滤波,彩色 sigma=param1,空间 sigma=param2. 平滑操作的第一个参数. param2 平滑操作的第二个参数. 对于简单/非尺度变换的高斯模糊的情况,如果 param2的值为零,则表示其被设定为param1。 param3

对应高斯参数的 Gaussian sigma (标准差). 如果为零,则标准差由下面的核尺寸计算: sigma = (n/2 - 1)*0.3 + 0.8, 其中 n=param1 对应水平核, n=param2 对应垂直核. 对小的卷积核 (3×3 to 7×7) 使用如上公式所示的标准 sigma 速度会快。如果 param3 不为零,而 param1 和 param2 为零,则核大小有sigma 计算 (以保证足够精确的操作). 函数 cvSmooth 可使用上面任何一种方法平滑图像。每一种方法都有自己的特点以及局限。 没有缩放的图像平滑仅支持单通道图像,并且支持8位到16位的转换(与cvSobel和cvaplace相似)和32位浮点数到32位浮点数的变换格式。 简单模糊和高斯模糊支持 1- 或 3-通道, 8-比特和 32-比特浮点图像。这两种方法可以(in-place)方式处理图像。 中值和双向滤波工作于 1- 或 3-通道, 8-位图像,但是不能以 in-place 方式处理图像. 2.IplImage结构 由于OpenCV主要针对的是计算机视觉方面的处理,因此在函数库中,最重要的结构体是IplImage结构。IplImage结构来源于Intel的另外一个函数库Intel Image Processing Library (IPL),该函数库主要是针对图像处理。IplImage结构具体定义如下: typedef struct _IplImage { int nSize; /* IplImage大小 */ int ID; /* 版本 (=0)*/

相关主题