图像变换--灰度切割、位图切割

原创 2013年12月06日 16:26:25

灰度切割:分为两种情况,一种情况是将某段阈值的图像设为一个较高值,其它灰度指定一个较低值。另一种情况是所需范围的灰度变亮,但仍保持图像的背景和灰度色调。

for (int i = 0; i < img_height - 1; i++)
  {
   for (int j = 0; j < img_width - 1; j++)
   {
    uchar cur = data[i * img_width + j];

    if (cur > 20 && cur < 200)
    {
     cur  = cur + 50;
     if (cur < 0)
     {
      cur =0;
     }
     else if(cur > 255)
     {
      cur =255;
     }
     data[i * img_width + j] = cur;
    }
   }
  }

位图切割:就8比物图像的位平面抽取而主,说明用一个灰度阈值变换函数处理输入图像可以获得位平面7的二值图像并不困难。该灰度阈值变换函数:(1)把图像中0和127间的所有灰度映射到一个灰度级例如(0)(2)把129到255间的灰度映射为另一种灰度级。例如(255)

#include "math.h"
#include"cv.h"
#include"highgui.h"


int main(int argc,char **argv)

 IplImage *pImg;
 IplImage *pImg_gray;
 IplImage *pImg_cut[8];
 

 if(argc == 3 && (pImg = cvLoadImage(argv[1],-1))!= 0)
 { 
  
  pImg_gray = cvCreateImage(cvGetSize(pImg), IPL_DEPTH_8U, 1);


  cvCopy(pImg,pImg_gray,NULL);
  
  int img_width = pImg->width;//image width
  int img_height = pImg->height;//image height

  uchar *data;
  data = (uchar *)pImg_gray->imageData;
  uchar *data_cut[8];
  pImg_cut[0] = cvCreateImage(cvGetSize(pImg), IPL_DEPTH_8U, 1);
  pImg_cut[1] = cvCreateImage(cvGetSize(pImg), IPL_DEPTH_8U, 1);
  pImg_cut[2]= cvCreateImage(cvGetSize(pImg), IPL_DEPTH_8U, 1);
  pImg_cut[3] = cvCreateImage(cvGetSize(pImg), IPL_DEPTH_8U, 1);
  pImg_cut[4] = cvCreateImage(cvGetSize(pImg), IPL_DEPTH_8U, 1);
  pImg_cut[5] = cvCreateImage(cvGetSize(pImg), IPL_DEPTH_8U, 1);
  pImg_cut[6] = cvCreateImage(cvGetSize(pImg), IPL_DEPTH_8U, 1);
  pImg_cut[7] = cvCreateImage(cvGetSize(pImg), IPL_DEPTH_8U,1);

  
  uchar zhi = 1;
  for (int k = 0; k< 8 ;k++)
  {
   data_cut[k] = (uchar *)pImg_gray->imageData;
   if (k > 0)
    zhi = zhi<<1;
   for (int i = 0; i< img_height; i++)
   {
    for (int j = 0; j< img_width ; j++)
    {
      uchar cur = data[i * img_width + j];
         cur = cur & 0x40; //按位与运算
      if (cur == 1)
      {
       cur = 255;
      }
      else cur = 0;
      data[i * img_width + j] = cur;
     
    }

   }
   cvCopy(pImg_gray,pImg_cut[k],NULL);
   cvCopy(pImg,pImg_gray,NULL);
   

  }

  cvNamedWindow("log1",1);//create window
  cvNamedWindow("log2",2);//create window
  cvNamedWindow("log3",3);//create window
  cvNamedWindow("log4",4);//create window
  cvNamedWindow("log5",5);//create window
  cvNamedWindow("log6",6);//create window
  cvNamedWindow("log7",7);//create window
  cvNamedWindow("log8",8);//create window

  cvShowImage("log1", pImg_cut[0]);
  cvShowImage("log2", pImg_cut[1]);
  cvShowImage("log3", pImg_cut[2]);
  cvShowImage("log4", pImg_cut[3]);
  cvShowImage("log5", pImg_cut[4]);
  cvShowImage("log6", pImg_cut[5]);
  cvShowImage("log7", pImg_cut[6]);
  cvShowImage("log8", pImg_cut[7]);

  cvWaitKey(0);

  cvDestroyWindow("canny");

  cvReleaseImage(&pImg);
  cvReleaseImage(&pImg_gray);
  
  return 0;
 }
 
 return -1;
}

 

 


 

 


#include "math.h"
#include"cv.h"
#include"highgui.h"
//#include <iostream>
//using namespace std;


int main(int argc,char **argv)
{
 /*IplImage *img=cvLoadImage("F:\HU\testopencv\pp.jpg");
 cvNamedWindow("Example1",CV_WINDOW_AUTOSIZE);
 cvShowImage("Example1",img);
 cvWaitKey(0);
 cvReleaseImage(&img);
 cvDestroyWindow("Example1"); */
 //图像反转
 IplImage *pImg;
 IplImage *pImg_gray;
 IplImage *pImg_cut[8];
 /*IplImage *pImg_cut0;
 IplImage *pImg_cut1;
 IplImage *pImg_cut2;
 IplImage *pImg_cut3;
 IplImage *pImg_cut4;
 IplImage *pImg_cut5;
 IplImage *pImg_cut6;
 IplImage *pImg_cut7;*/
 /*pImg_cut0 = cvCreateImage(cvGetSize(pImg), IPL_DEPTH_8U, 1);
 pImg_cut1 = cvCreateImage(cvGetSize(pImg), IPL_DEPTH_8U, 1);
 pImg_cut2 = cvCreateImage(cvGetSize(pImg), IPL_DEPTH_8U, 1);
 pImg_cut3 = cvCreateImage(cvGetSize(pImg), IPL_DEPTH_8U, 1);
 pImg_cut4 = cvCreateImage(cvGetSize(pImg), IPL_DEPTH_8U, 1);
 pImg_cut5 = cvCreateImage(cvGetSize(pImg), IPL_DEPTH_8U, 1);
 pImg_cut6 = cvCreateImage(cvGetSize(pImg), IPL_DEPTH_8U, 1);
 pImg_cut7 = cvCreateImage(cvGetSize(pImg), IPL_DEPTH_8U, 1);*/
 //IplImage *pImg_bi;
 

 if(argc == 3 && (pImg = cvLoadImage(argv[1],-1))!= 0)
 { 
  
  pImg_gray = cvCreateImage(cvGetSize(pImg), IPL_DEPTH_8U, 1);
 // cvCvtColor(pImg,pImg_gray,CV_BGR2GRAY);
  cvCopy(pImg,pImg_gray,NULL);
  //pImg_bi = cvCreateImage(cvGetSize(pImg), IPL_DEPTH_8U, 1);
  //cvThreshold(pImg_gray,pImg_bi,127,255  ,CV_THRESH_BINARY);
  //int a = pImg_bi->nChannels;
  //int bi_width = pImg_bi->
  int img_width = pImg->width;//image width
  int img_height = pImg->height;//image height

  uchar *data;
  data = (uchar *)pImg_gray->imageData;
  uchar *data_cut[8];
  pImg_cut[0] = cvCreateImage(cvGetSize(pImg), IPL_DEPTH_8U, 1);
  pImg_cut[1] = cvCreateImage(cvGetSize(pImg), IPL_DEPTH_8U, 1);
  pImg_cut[2]= cvCreateImage(cvGetSize(pImg), IPL_DEPTH_8U, 1);
  pImg_cut[3] = cvCreateImage(cvGetSize(pImg), IPL_DEPTH_8U, 1);
  pImg_cut[4] = cvCreateImage(cvGetSize(pImg), IPL_DEPTH_8U, 1);
  pImg_cut[5] = cvCreateImage(cvGetSize(pImg), IPL_DEPTH_8U, 1);
  pImg_cut[6] = cvCreateImage(cvGetSize(pImg), IPL_DEPTH_8U, 1);
  pImg_cut[7] = cvCreateImage(cvGetSize(pImg), IPL_DEPTH_8U, 1);

 /*  //for (int i = 0; i < img_height - 1; i++)
  //{
  // for (int j = 0; j < img_width - 1; j++)
  // {
  //  uchar cur = data[i * img_width + j];
  //   
  //  //cur =  3 * log((double)cur + 1.0);
  //  cur =  6 * sqrt((float)cur);
  //  if (cur < 0)
  //  {
  //   cur =0;
  //  }
  //  else if(cur > 255)
  //  {
  //   cur =255;
  //  }
  // }
  //}
  //line trans func线性变换
  float ratio = -3;//斜率
  float intercept = -838;//截距

  for (int i = 0; i < img_height - 1; i++)
  {
   for (int j = 0; j < img_width - 1; j++)
   {
    uchar cur = data[i * img_width + j];
    /*cur = ratio * cur + intercept;//线性变换

    data[i * img_width + j] = cur;
    if (cur < 0)
    {
     cur =0;
    }
    else if(cur > 255)
    {
     cur =255;
    }*/
   /* if (cur > 20 && cur < 200)
    {
     cur  = cur + 50;
     if (cur < 0)
     {
      cur =0;
     }
     else if(cur > 255)
     {
      cur =255;
     }
     data[i * img_width + j] = cur;
    }
   }
  }*/

  /*for (int i = 0; i< img_height -1 ; i++)
  {
  for (int j = 0; j< img_width -1; j++)
  {
  printf("%d",data[i * img_width + j]);
  }
  printf("\n");
  }*/
//  cvSaveImage(argv[2],pImg_bi);
  uchar zhi = 1;
  for (int k = 0; k< 8 ;k++)
  {
   data_cut[k] = (uchar *)pImg_gray->imageData;
   if (k > 0)
    zhi = zhi<<1;
   for (int i = 0; i< img_height; i++)
   {
    for (int j = 0; j< img_width ; j++)
    {
      uchar cur = data[i * img_width + j];
         cur = cur & 0x40; //按位与运算
      if (cur == 1)
      {
       cur = 255;
      }
      else cur = 0;
      data[i * img_width + j] = cur;
     
    }

   }
   cvCopy(pImg_gray,pImg_cut[k],NULL);
   cvCopy(pImg,pImg_gray,NULL);
   

  }

  cvNamedWindow("log1",1);//create window
  cvNamedWindow("log2",2);//create window
  cvNamedWindow("log3",3);//create window
  cvNamedWindow("log4",4);//create window
  cvNamedWindow("log5",5);//create window
  cvNamedWindow("log6",6);//create window
  cvNamedWindow("log7",7);//create window
  cvNamedWindow("log8",8);//create window

  cvShowImage("log1", pImg_cut[0]);
  cvShowImage("log2", pImg_cut[1]);
  cvShowImage("log3", pImg_cut[2]);
  cvShowImage("log4", pImg_cut[3]);
  cvShowImage("log5", pImg_cut[4]);
  cvShowImage("log6", pImg_cut[5]);
  cvShowImage("log7", pImg_cut[6]);
  cvShowImage("log8", pImg_cut[7]);

  cvWaitKey(0);

  cvDestroyWindow("canny");

  cvReleaseImage(&pImg);
  cvReleaseImage(&pImg_gray);
  //cvReleaseImage(&pImg_bi);
  return 0;
 }
 //printf("%s\n %s\n%s\n", argv[0],argv[1],argv[2]);
 return -1;
}

 

 


 

 

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

[数字图像处理]灰度变换——反转,对数变换,伽马变换,灰度拉伸,灰度切割,位图切割

灰度变换,属于一个非常重要的概念。这里主要参考《Digital Image Processing》 Rafael C. Gonzalez / Richard E. Woods 的第三章。书中所有的实验...
  • thnh169
  • thnh169
  • 2013年10月14日 16:54
  • 13993

AS3 位图切割

package { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.Loa...

灰度图像--图像分割 区域分割之区域生长

区域生长

灰度图像阈值化分割常见方法总结及VC实现

在图像处理领域,二值图像运算量小,并且能够体现图像的关键特征,因此被广泛使用。将灰度图像变为二值图像的常用方法是选定阈值,然后将待处理图像的每个像素点进行单点处理,即将其灰度值与所设置的门限进行比对,...

MatLab自编的均值滤波、中值滤波、高斯滤波三种滤波算子,可以直接调用 图像处理函数

%自编的均值滤波函数。x是需要滤波的图像,n是模板大小(即n×n) function d=avefilt(x,n) a(1:n,1:n)=1; %a即n×n模板,元素全是1 p=size(x)...

Bhattacharyya 距离(附matlab代码)

function d=bhattacharyya(X1,X2)  % BHATTACHARYYA  Bhattacharyya distance between two Gaussian cla...

[数字图像处理]灰度变换——反转,对数变换,伽马变换,灰度拉伸,灰度切割,位图切割

灰度变换,属于一个非常重要的概念。这里主要参考《Digital Image Processing》 Rafael C. Gonzalez / Richard E. Woods 的第三章。书中所有的实验...

[数字图像处理]灰度变换——反转,对数变换,伽马变换,灰度拉伸,灰度切割,位图切割

灰度变换,属于一个非常重要的概念。这里主要参考《Digital Image Processing》 Rafael C. Gonzalez / Richard E. Woods 的第三章。书中所有的实验...

【数字图像】C++8位和24位BMP位图的平滑、锐化、二值化处理,以及24位真彩图的灰度化

由于8位和24位BMP的像素存储方式不同,所以不能用相同的函数对位图进行处理,因此我设计了两个类分别处理8位和24位BMP。 程序运行时,首先提示输入位图深度。 然后输入位图名称。 程序会...

(学习笔记6)BMP位图照片的灰度变换之直方图

接着(学习笔记5)来写,注意注意是在(学习笔记5)上去写直方图的。每个学习笔记都是在前一个基础上去写的。 好的废话完了,直接写直方图。step1.修改菜单栏中灰度变换下直方图的ID,如下图所示: ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:图像变换--灰度切割、位图切割
举报原因:
原因补充:

(最多只允许输入30个字)