图像处理

来源:互联网 发布:java中static修饰变量 编辑:程序博客网 时间:2024/06/05 13:16

学习数字图像处理的时候写的一些小功能

加载图像后像素点B/G/R的访问:
m_Image.m_pBits[0][y][x]=0;//B
m_Image.m_pBits[1][y][x]=0;//G
m_Image.m_pBits[2][y][x]=0;//R
图像的左上角为源点,向右为X正向,向下为y正向


1:显示RGB分量

void CImage_ProcessingView::OnRgb(){// TODO: 在此添加命令处理程序代码if(m_Image.IsNull()) return;//判断图像是否为空,如果对空图像进行操作会出现未知的错误int w=m_Image.GetWidth();//获得图像的宽度int h=m_Image.GetHeight();//获得图像的高度Cchoose mychoose=new Cchoose();CStringArray strArray;strArray.Add(L"R");strArray.Add(L"G");strArray.Add(L"B");mychoose.strArray.Copy(strArray);mychoose.DoModal();//this->MessageBox(mychoose.chooseResult);CString choose = mychoose.chooseResult;//this->MessageBox(choose);CString mR=_T("R");if(choose.Compare(L"R")==0){for (int j=0;j<h;j++){for (int k=0;k<w;k++){m_Image.m_pBits[0][j][k]=m_Image.m_pBits[1][j][k]=m_Image.m_pBits[2][j][k];}}}else if(choose.Compare(L"G")==0){for (int j=0;j<h;j++){for (int k=0;k<w;k++){m_Image.m_pBits[0][j][k]=m_Image.m_pBits[2][j][k]=m_Image.m_pBits[1][j][k];}}}else if(choose.Compare(L"B")==0){for (int j=0;j<h;j++){for (int k=0;k<w;k++){m_Image.m_pBits[1][j][k]=m_Image.m_pBits[2][j][k]=m_Image.m_pBits[0][j][k];}}}Invalidate(1); //强制调用ONDRAW函数,ONDRAW会绘制图像}

2:显示HSI分量 

void CImage_ProcessingView::OnHsi(){// TODO: 在此添加命令处理程序代码if(m_Image.IsNull()) return;//判断图像是否为空,如果对空图像进行操作会出现未知的错误int w=m_Image.GetWidth();//获得图像的宽度int h=m_Image.GetHeight();//获得图像的高度Cchoose mychoose=new Cchoose();CStringArray strArray;strArray.Add(L"H");strArray.Add(L"S");strArray.Add(L"I");mychoose.strArray.Copy(strArray);mychoose.DoModal();//this->MessageBox(mychoose.chooseResult);CString choose = mychoose.chooseResult;//this->MessageBox(choose)double value=0;if(choose.Compare(L"H")==0){for (int j=0;j<h;j++){for (int k=0;k<w;k++){double angle1=((m_Image.m_pBits[2][j][k]-m_Image.m_pBits[1][j][k])+(m_Image.m_pBits[2][j][k]-m_Image.m_pBits[0][j][k]))/2.0;double angle2=sqrt((double)((m_Image.m_pBits[2][j][k]-m_Image.m_pBits[1][j][k])*(m_Image.m_pBits[2][j][k]-m_Image.m_pBits[1][j][k])+(m_Image.m_pBits[2][j][k]-m_Image.m_pBits[0][j][k])*(m_Image.m_pBits[1][j][k]-m_Image.m_pBits[0][j][k])));double angle=acos(angle1/angle2);if(m_Image.m_pBits[0][j][k]>m_Image.m_pBits[1][j][k]){angle=360-angle;}m_Image.m_pBits[0][j][k]=m_Image.m_pBits[1][j][k]=m_Image.m_pBits[2][j][k]=angle*(255.0/360.0);}}}else if(choose.Compare(L"S")==0){int min;for (int j=0;j<h;j++){for (int k=0;k<w;k++){min=m_Image.m_pBits[0][j][k];for(int m=0;m<3;m++){if(m_Image.m_pBits[m][j][k]<min)min=m_Image.m_pBits[m][j][k];}value=1.0-(3.0/(m_Image.m_pBits[0][j][k]+m_Image.m_pBits[1][j][k]+m_Image.m_pBits[2][j][k]))*min;m_Image.m_pBits[0][j][k]=m_Image.m_pBits[1][j][k]=m_Image.m_pBits[2][j][k]=value*255;}}}else if(choose.Compare(L"I")==0){for (int j=0;j<h;j++){for (int k=0;k<w;k++){ value=(m_Image.m_pBits[0][j][k]+m_Image.m_pBits[1][j][k]+m_Image.m_pBits[2][j][k])/3; m_Image.m_pBits[0][j][k]=m_Image.m_pBits[1][j][k]=m_Image.m_pBits[2][j][k]=value;}}}Invalidate(1); //强制调用ONDRAW函数,ONDRAW会绘制图像}



3:图像分解为不同灰度分辨率

void CImage_ProcessingView::OnRatio(){//设置灰度分辨率选项Cchoose mychoose=new Cchoose();CStringArray strArray;strArray.Add(L"128");strArray.Add(L"64");strArray.Add(L"32");strArray.Add(L"16");strArray.Add(L"8");strArray.Add(L"4");strArray.Add(L"2");mychoose.strArray.Copy(strArray);mychoose.DoModal();//this->MessageBox(mychoose.chooseResult);int fbl = _ttoi(mychoose.chooseResult);if(m_Image.IsNull()) return;//判断图像是否为空,如果对空图像进行操作会出现未知的错误int w=m_Image.GetWidth();//获得图像的宽度int h=m_Image.GetHeight();//获得图像的高度//获取灰度图像BYTE aa;for (int j=0;j<h;j++){for (int k=0;k<w;k++){aa= (m_Image.m_pBits[0][j][k]+m_Image.m_pBits[1][j][k]+m_Image.m_pBits[2][j][k])/3.0;for(int m=0;m<256;m+=256/fbl){if(aa>=m&&aa<(m+256/fbl)){m_Image.m_pBits[0][j][k]=m;m_Image.m_pBits[1][j][k]=m;m_Image.m_pBits[2][j][k]=m;break;}}}}Invalidate(1); //强制调用ONDRAW函数,ONDRAW会绘制图像}



4:显示直方图

void CImage_ProcessingView::OnXszft(){// TODO: 在此添加命令处理程序代码if(m_Image.IsNull()) return;//判断图像是否为空,如果对空图像进行操作会出现未知的错误int w=m_Image.GetWidth();//获得图像的宽度int h=m_Image.GetHeight();//获得图像的高度    double a[256]={};int gray=0;//求个数for (int j=0;j<h;j++){for (int k=0;k<w;k++){gray=(m_Image.m_pBits[0][j][k]+m_Image.m_pBits[1][j][k]+m_Image.m_pBits[2][j][k])/3.0;a[gray]++;}}//归一化CString mystr;for(int i=0;i<256;i++){a[i]=a[i]/((double)(w*h));//this->MessageBox(mystr.Format(_T("%f"),a[i]));}//显示绘制的直方图Histogram histogram=new Histogram();memcpy(histogram.value,a,sizeof(a));histogram.DoModal();}

void Histogram::OnBnClickedButton1(){// TODO: 在此添加控件通知处理程序代码CDC *pDC=m_picDraw.GetDC();    CPen newPen;       // 用于创建新画笔       CPen *pOldPen;     // 用于存放旧画笔       CBrush newBrush;   // 用于创建新画刷       CBrush *pOldBrush; // 用于存放旧画刷       // 创建黑色新画刷       newBrush.CreateSolidBrush(RGB(0,0,0));       // 选择新画刷,并将旧画刷的指针保存到pOldBrush       pOldBrush = pDC->SelectObject(&newBrush);       // 以黑色画刷为绘图控件填充黑色,形成黑色背景         // 创建实心画笔,粗度为1,颜色为绿色       newPen.CreatePen(PS_SOLID, 1, RGB(0,0,255));       // 选择新画笔,并将旧画笔的指针保存到pOldPen       pOldPen = pDC->SelectObject(&newPen); for(int i=0;i<256;i++){pDC->MoveTo(10+2*i,300);    pDC->LineTo(10+2*i,300-4000*(value[i]));}    pDC->SelectObject(pOldPen);     pDC->SelectObject(pOldBrush);       newBrush.DeleteObject();       newPen.DeleteObject(); }




5:直方图均衡化

void CImage_ProcessingView::OnJhh(){// TODO: 在此添加命令处理程序代码if(m_Image.IsNull()) return;//判断图像是否为空,如果对空图像进行操作会出现未知的错误int w=m_Image.GetWidth();//获得图像的宽度int h=m_Image.GetHeight();//获得图像的高度    double a[256]={};int result[256]={};int gray=0;//求个数for (int j=0;j<h;j++){for (int k=0;k<w;k++){gray=(m_Image.m_pBits[0][j][k]+m_Image.m_pBits[1][j][k]+m_Image.m_pBits[2][j][k])/3.0;a[gray]++;}}for(int i=0;i<256;i++){a[i]=a[i]/((double)(w*h));//this->MessageBox(mystr.Format(_T("%f"),a[i]));}for(int i=0;i<256;i++){double sum=0;for(int j=0;j<=i;j++){sum+=a[j];}result[i]=sum*255;}//图片赋值for (int j=0;j<h;j++){for (int k=0;k<w;k++){gray=(int)((m_Image.m_pBits[0][j][k]+m_Image.m_pBits[1][j][k]+m_Image.m_pBits[2][j][k])/3.0);m_Image.m_pBits[0][j][k]=m_Image.m_pBits[1][j][k]=m_Image.m_pBits[2][j][k]=result[gray];}}Invalidate(1); //强制调用ONDRAW函数,ONDRAW会绘制图像}



6:全局阈值算法分割图像

void CImage_ProcessingView::Onjbqjfzsf(){// TODO: 在此添加命令处理程序代码if(m_Image.IsNull()) return;//判断图像是否为空,如果对空图像进行操作会出现未知的错误int w=m_Image.GetWidth();//获得图像的宽度int h=m_Image.GetHeight();//获得图像的高度double gray=0;double avg=0;double newAvg=0;for (int j=0;j<h;j++){for (int k=0;k<w;k++){gray=(m_Image.m_pBits[0][j][k]+m_Image.m_pBits[1][j][k]+m_Image.m_pBits[2][j][k])/3;avg+=gray;}}avg=avg/(w*h);newAvg=avg;do{avg=newAvg;double num1=0;double num2=0;double sum1=0,sum2=0;for (int j=0;j<h;j++){for (int k=0;k<w;k++){gray=(m_Image.m_pBits[0][j][k]+m_Image.m_pBits[1][j][k]+m_Image.m_pBits[2][j][k])/3;if(gray<avg){sum1+=gray;num1++;}else{sum2+=gray;num2++;}}}newAvg=(sum1/num1+sum2/num2)/2;}while(abs(newAvg-avg)>5);for (int j=0;j<h;j++){for (int k=0;k<w;k++){gray=(m_Image.m_pBits[0][j][k]+m_Image.m_pBits[1][j][k]+m_Image.m_pBits[2][j][k])/3;if(gray<newAvg){m_Image.m_pBits[0][j][k]=m_Image.m_pBits[1][j][k]=m_Image.m_pBits[2][j][k]=0;}else{m_Image.m_pBits[0][j][k]=m_Image.m_pBits[1][j][k]=m_Image.m_pBits[2][j][k]=255;}}}Invalidate(1);}




原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 北京驾驶证在深圳扣了分怎么办 c照一次被扣12分怎么办 教师资格证认定申请表填错了怎么办 外地车在北京违章没有牡丹卡怎么办 护士辞职了原单位不给延续怎么办 护士证注册的单位倒闭了怎么办 护士证注册的医院倒闭了怎么办 显示发货了但没物流信息怎么办 考科目三被别人举报了怎么办 科目一考了5没过怎么办 常州c1驾驶证满了12分怎么办 预约科目三成功后没交钱怎么办 预约成功后驾校不提交档案怎么办 c2刚满一年的驾照扣12分怎么办 怀孕6个月咳嗽很厉害怎么办 家门口有电线杆影响我建楼房怎么办 卡丢了不知道卡号怎么办 驾考网上预约用户被锁定了怎么办 人才中心拿出来的户口掉了怎么办 父母是南京集体户孩子没户口怎么办 二建挂靠中介单位不给证怎么办 小包工头遇到工人在工地摔伤怎么办 外地人买了城中村的房子改造怎么办 深圳社保怀孕了产检异地怎么办 成都公租房租满6年怎么办 二建审核资料如果照片丢失怎么办 身份证被冒用在外地办社保怎么办 蔷薇的嫩叶都被太阳晒死了怎么办 乐视手机进水了屏幕失灵怎么办 乐视手机进水了屏幕不显示怎么办 美团商家单量出现下滑怎么办 想开个小超市没经营过怎么办 华为7c手机wifi信号差怎么办 贞子从电视里爬出来怎么办 2个月的婴儿吓到怎么办 排卵日同房了没避孕怕怀孕怎么办 妻子因为我欺骗她要跟我离婚怎么办 老婆用苹果手机共享我的位置怎么办 孕妇餐后2小时血糖偏高怎么办 孕妇血糖餐后2小时数值高怎么办 股市退市的话股民的钱怎么办