最近做的课程作业需要用到CImage函数处理图像,其中涉及到读取图像以及对图像像素进行操作,在这里记录一下自己的理解。

首先是CImage类的定义和读取图片

 CImage srcImage;CImage dstImage;CString path = "C:\\Users\\Administrator\\Desktop\\阈值分割_20172120658\\input.png";CString pathdown = "C:\\Users\\Administrator\\Desktop\\阈值分割_20172120658\\outtput.png";

如图 定义两个CImage类的对象,然后使用CString类型的变量定义图片的读取路径和保存路径。

 srcImage.Load(path);byte* pRealData; 

这里利用CImage::Load()函数读取图片到srcImage中,接下来准备读取图像中的像素值,因为在CImage中利用堆栈进行读取的方法速度很慢,在这里我就不写了,这里使用的是直接利用c里面的指针对像素进行读取和遍历操作。首先定义一个byte类型的指针。

 pRealData = (byte*)srcImage.GetBits(); //获取到图片内存点的位置int pit = srcImage.GetPitch();            //图像每行字节数int bitCount = srcImage.GetBPP() / 8; //获取每像素的位数~~/8得到字节数cout << "图像每行的字节数" << pit << " " << "图像每个像素的位数" << bitCount << endl;

利用CImage::GetBits()函数获取图片内存点的位置,使用这种方法的时候,需要考虑图形的结构,使用CImage::GetBPP获取每个像素点占几位,还需要使用CImage::GetPitch获取每一行位的个数,根据GetPitch的正负值来判定GetBits获取到的head是首行的还是尾行的。负值即为尾部,正值即为头部。

其中pit得到的是字节数,也就是说如果每个像素有3个字节(RGB),一个宽为100像素的图片它的CImage::GetPitch()就是300。CImage::GetBPP()得到的是每个像素的位数,通常灰度图为8或者32,三通道RGB图像为24位。

 int height = srcImage.GetHeight();int width = srcImage.GetWidth();cout << "height" << height << "   width" << width << endl;vector<int> gray(256);for (int i = 1; i <= 256; i++){gray.push_back(0);}for (int i = 0; i < height; i++){for (int j = 0; j < width; j++){gray.at((int)(*(pRealData + pit*i + j*bitCount))) += 1;}}

对图像的像素进行读取,需要对指针进行转换,转换为int类型。我这里是对图像的灰度值进行了统计处理。

最后附上一个利用直方图做的图像二值化

#include<atlimage.h>
#include<stdio.h>
#include<iostream>
#include<vector>
#include<opencv2\opencv.hpp>
using namespace std;
using namespace cv;void main()
{CImage srcImage;CImage dstImage;CString path = "C:\\Users\\Administrator\\Desktop\\阈值分割_20172120658\\input.png";CString pathdown = "C:\\Users\\Administrator\\Desktop\\阈值分割_20172120658\\outtput.png";srcImage.Load(path);byte* pRealData; byte* pRealData1; byte* pRealData2; byte* pRealData3;pRealData = (byte*)srcImage.GetBits();  //获取到图片内存点的位置int pit = srcImage.GetPitch();            //图像每行字节数int bitCount = srcImage.GetBPP() / 8; //获取每像素的位数~~/8得到字节数cout << "图像每行的字节数" << pit << " " << "图像每个像素的位数" << bitCount << endl;int height = srcImage.GetHeight();int width = srcImage.GetWidth();cout << "height" << height << "   width" << width << endl;vector<int> gray(256);for (int i = 1; i <= 256; i++){gray.push_back(0);}//pRealData1 = pRealData;for (int i = 0; i < height; i++){for (int j = 0; j < width; j++){gray.at((int)(*(pRealData + pit*i + j*bitCount))) += 1;}}int max = 0;int sec = 0;int locamax = 0;int locasec = 0;for (int i = 0; i < 256; i++){cout << i << "---" << gray[i] << endl;if (gray[i] > max){max = gray[i];locamax = i;        //获取相同灰度值像素点最多的灰度值}}for (int i = 0; i < 256; i++){if (gray[i] > sec&&abs(i-locamax)>10)    //第二多的点需要距离最多的点至少10个灰度单位{sec = gray[i];locasec = i;     //获取相同灰度值像素点第二多的灰度值}}cout <<locamax<<"__"<<locasec << endl;int min = (locamax + locasec) / 2;    //取两峰中间值作为二值化分割阈值for (int i = 0; i < height; i++){for (int j = 0; j < width; j++){if ((int)(*(pRealData + pit*i + j*bitCount)) < min){*(pRealData + pit*i + j*bitCount) = 0;*(pRealData + pit*i + j*bitCount+1) = 0;*(pRealData + pit*i + j*bitCount+2) = 0;}else{*(pRealData + pit*i + j*bitCount) = 255;*(pRealData + pit*i + j*bitCount + 1) = 255;*(pRealData + pit*i + j*bitCount + 2) = 255;}}}srcImage.Save(pathdown);system("pause");
}

  原图

           二值化

【编程语言】利用CImage类对图像像素的处理(图像二值化)相关推荐

  1. 利用最大熵进行阈值分割从而实现灰度图像的二值化的原理概要及OpenCV代码

    图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 详细的数学原理目前我也没搞明白,所以只说下原理概 ...

  2. halcon—利用顶帽操作减轻图像灰度不均匀对二值化的影响

    先看原图 由于这副图像的灰度是渐变的,如果直接进行二值化处理的话......,会是这个样子 附上顶帽操作相关介绍顶帽运算和黑帽运算 - 爱码网 (likecs.com) 先使用halcon自带顶帽函数 ...

  3. 利用OpenCV的threshold函数实现双阈值法二值化操作的源码

    直接上源码吧,很简单,一看就懂,如果你不明白,可以举两个灰度值实际代入进行理解! 源码如下: 源码中用到的图像的下载链接为:hand1.jpg_免费高速下载|百度网盘-分享无限制 图像处理开发需求.图 ...

  4. 利用OpenCV的函数createTrackbar创建滑动条查看二值化的最优阈值的源码及讲解

    图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 这个功能的实现其实很简单,主要是要明白creat ...

  5. 利用Python实现图像的二值化

    目录 1.全局阈值法 1.1主要函数: 1.2全局阈值的代码实现 1.3特点 2.自适应阈值法 2.1主要函数: 2.2实现代码: 2.3特点: 3.OTSU二值化(最大类间方差法) 3.1实现代码: ...

  6. matlab 图像二值化 后0、1像素的个数统计

    目标: 批量处理RGB图像,对其进行二值化处理(需要考虑二值化的阈值设置,此处不展开) 统计二值化之后,各个黑白图像中0.1 的像素点数目 使用折线图的方式,展示出统计的结果 首先进行输入文件夹 与输 ...

  7. 【OpenCV 4开发详解】图像二值化

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  8. 二值化图像的欧拉数_Android OpenCV(八):图像二值化

    图像二值化 简介 图像二值化( Image Binarization)就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果的过程.在数字图像处理中,二值图像占有非常重要的 ...

  9. 图像预处理(二值化)

    图像预处理(二值化) 本文的实验是主要通过opencv与python3实现,相关的代码可以在GitHub中找到. 1. 图像获取与灰度化 通过摄像头获取到的图像为彩色的图像.彩色图像主要分为两种类型, ...

  10. 图像二值化处理(全局阈值 自适应阈值 手动阈值操作以及直方图画法)

    文章目录 图像二值化处理 二值化原理 API介绍 手动设置阈值 均值法 迭代法 自动设置阈值 直方图法 全局阈值法 OTSU法 三角形法 自适应阈值法 API 绘制图像直方图 图像二值化处理 二值化原 ...

最新文章

  1. 阿里程序员连续两次绩效3.25!大老板威胁要开除他!还不给赔偿金!问大家该如何维权?...
  2. jQuery中HTML的操作
  3. python万年历_Python实现的简单万年历例子分享
  4. 马云创造的就业机会多还是毁掉的就业机会多?
  5. 快速排序(java版)
  6. 反射在工厂模式中的使用
  7. delphi mysql类_Delphi MySQL数据库操作类
  8. 小米3g刷高格固件_不走弯路:小米路由器3G 刷Padavan固件简单教程
  9. 仿迅雷播放器教程 -- 提取exe资源(12)
  10. Growing Mushrooms
  11. Windows7系统怎么给文件夹加密?
  12. 【一文快速理解23种设计模式】
  13. JAVA8的ConcurrentHashMap为什么放弃了分段锁,有什么问题吗,如果你来设计,你如何 设计。
  14. 明朝时期中外的火器对比
  15. 计算机屏幕自己动,电脑显示器老是自动调整怎么办
  16. 腾讯推送——信鸽测试
  17. 8.关于删除操作中axis=0和axis=1的理解(Python版)
  18. 【淘宝SEO】搜索诊断助手新增作弊检测
  19. KMIP4J数据处理流程
  20. DFM实例分享-替代料审查

热门文章

  1. 利用CIBERSORT免疫细胞类群分析详细教程
  2. 火狐linux 32位,火狐浏览器下载电脑版32位
  3. Nexus学习日记:N7K VDC命令详解
  4. 智能汽车发展战略-思维导图版本
  5. 基于深度学习的图像隐写分析综述 阅读
  6. Tone Mapping Correction
  7. 屏幕录制方法?如何在电脑进行屏幕录制
  8. 长时间看电脑的朋友,怎么保护您的眼睛
  9. 搞模具的想转行学计算机,为什么很少人去做模具设计学徒,看看这里你就明白了!...
  10. 移动APP基于支付宝支付实现用户提现功能