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

原创 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;
}

 

 


 

 

 

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

灰度图像--图像分割 区域分割之分水岭算法

分水岭算法
  • TonyShengTan
  • TonyShengTan
  • 2015年03月11日 12:01
  • 4671

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

灰度变换,属于一个非常重要的概念。这里主要参考《Digital Image Processing》 Rafael C. Gonzalez / Richard E. Woods 的第三章。书中所有的实验...
  • u012856866
  • u012856866
  • 2014年03月25日 15:17
  • 1650

切图--学习笔记(一)

正式的规律的学习生活已经开始了一周了,这一周的学习内容是html和css写静态页面,也就是所谓的切图。切图是每个前端的基本活,对于小白来讲,看着通过自己的代码变成网页时,心中是满满成就感。切了一周的图...
  • Jaya_lee
  • Jaya_lee
  • 2017年02月24日 13:40
  • 177

PhotoShop算法实现--图像错切(二十)

PhotoShop算法实现--图像错切(二十) kezunhai@gmail.com http://blog.csdn.net/kezunh...
  • kezunhai
  • kezunhai
  • 2014年12月04日 23:01
  • 1429

AS3 位图切割

package { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.Loa...
  • fengsser
  • fengsser
  • 2012年12月20日 15:14
  • 1499

位图bmp的API处理函数

/**********************************************************************************   *Visual C++数字图...
  • Radical608
  • Radical608
  • 2008年05月25日 15:46
  • 2984

android 选择照片(相册/拍照/切图)

private static final int PHOTO_REQUEST_CAREMA = 0;//相机拍照 private static final int PHOTO_REQUEST_...
  • Zhang_hongchao
  • Zhang_hongchao
  • 2015年11月03日 16:31
  • 592

Photoshop CC中对图片进行切片分割

1.新建一个文档 2.将欲处理图片拖入背景中 3.选择切片工具,左边第五个,如果没有(在裁剪工具选项中右键第三个),选择划分切片,如图3*4划分 4.在窗口->动作中...
  • wangjianyu0115
  • wangjianyu0115
  • 2015年09月01日 16:34
  • 2192

java 对图片进行切割,灰度化,切割操作

有时候项目中会对图片进行操作,像切图啦,二值化啦,灰度啦。。 在验证码识别的时候很有用 现在将java对图片操作的部分方法写下来  不管图片如何操作,关键是在new BufferIm...
  • joeyon
  • joeyon
  • 2014年12月26日 17:20
  • 1012

UIImageView的图片切割问题

在view上显示一张图片时,由于frame大小的限制,显示的图片可能会产生压缩的感觉,样子会不好看,因此我们会将图片进行切割。然后当点击图片时,再全部展示到view上。 UIImage *ima...
  • QianEr9312
  • QianEr9312
  • 2015年11月07日 15:06
  • 912
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:图像变换--灰度切割、位图切割
举报原因:
原因补充:

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