【编程语言】利用CImage类对图像像素的处理(图像二值化)
最近做的课程作业需要用到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类对图像像素的处理(图像二值化)相关推荐
- 利用最大熵进行阈值分割从而实现灰度图像的二值化的原理概要及OpenCV代码
图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 详细的数学原理目前我也没搞明白,所以只说下原理概 ...
- halcon—利用顶帽操作减轻图像灰度不均匀对二值化的影响
先看原图 由于这副图像的灰度是渐变的,如果直接进行二值化处理的话......,会是这个样子 附上顶帽操作相关介绍顶帽运算和黑帽运算 - 爱码网 (likecs.com) 先使用halcon自带顶帽函数 ...
- 利用OpenCV的threshold函数实现双阈值法二值化操作的源码
直接上源码吧,很简单,一看就懂,如果你不明白,可以举两个灰度值实际代入进行理解! 源码如下: 源码中用到的图像的下载链接为:hand1.jpg_免费高速下载|百度网盘-分享无限制 图像处理开发需求.图 ...
- 利用OpenCV的函数createTrackbar创建滑动条查看二值化的最优阈值的源码及讲解
图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 这个功能的实现其实很简单,主要是要明白creat ...
- 利用Python实现图像的二值化
目录 1.全局阈值法 1.1主要函数: 1.2全局阈值的代码实现 1.3特点 2.自适应阈值法 2.1主要函数: 2.2实现代码: 2.3特点: 3.OTSU二值化(最大类间方差法) 3.1实现代码: ...
- matlab 图像二值化 后0、1像素的个数统计
目标: 批量处理RGB图像,对其进行二值化处理(需要考虑二值化的阈值设置,此处不展开) 统计二值化之后,各个黑白图像中0.1 的像素点数目 使用折线图的方式,展示出统计的结果 首先进行输入文件夹 与输 ...
- 【OpenCV 4开发详解】图像二值化
本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...
- 二值化图像的欧拉数_Android OpenCV(八):图像二值化
图像二值化 简介 图像二值化( Image Binarization)就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果的过程.在数字图像处理中,二值图像占有非常重要的 ...
- 图像预处理(二值化)
图像预处理(二值化) 本文的实验是主要通过opencv与python3实现,相关的代码可以在GitHub中找到. 1. 图像获取与灰度化 通过摄像头获取到的图像为彩色的图像.彩色图像主要分为两种类型, ...
- 图像二值化处理(全局阈值 自适应阈值 手动阈值操作以及直方图画法)
文章目录 图像二值化处理 二值化原理 API介绍 手动设置阈值 均值法 迭代法 自动设置阈值 直方图法 全局阈值法 OTSU法 三角形法 自适应阈值法 API 绘制图像直方图 图像二值化处理 二值化原 ...
最新文章
- 阿里程序员连续两次绩效3.25!大老板威胁要开除他!还不给赔偿金!问大家该如何维权?...
- jQuery中HTML的操作
- python万年历_Python实现的简单万年历例子分享
- 马云创造的就业机会多还是毁掉的就业机会多?
- 快速排序(java版)
- 反射在工厂模式中的使用
- delphi mysql类_Delphi MySQL数据库操作类
- 小米3g刷高格固件_不走弯路:小米路由器3G 刷Padavan固件简单教程
- 仿迅雷播放器教程 -- 提取exe资源(12)
- Growing Mushrooms
- Windows7系统怎么给文件夹加密?
- 【一文快速理解23种设计模式】
- JAVA8的ConcurrentHashMap为什么放弃了分段锁,有什么问题吗,如果你来设计,你如何 设计。
- 明朝时期中外的火器对比
- 计算机屏幕自己动,电脑显示器老是自动调整怎么办
- 腾讯推送——信鸽测试
- 8.关于删除操作中axis=0和axis=1的理解(Python版)
- 【淘宝SEO】搜索诊断助手新增作弊检测
- KMIP4J数据处理流程
- DFM实例分享-替代料审查