图像灰度级数我们见得最多的就是256了,如果想调整它的灰度级数,我们可以使用图像库的imadjust函数来作出调整,比如讲256个灰度级变成2个灰度级(也就是二值图了)。再举一个例子,原来一幅256个灰度级的图像,如果我们把它的灰度级重新调整为4,那么调整后这幅图像的灰度值应该就是有4个值:0,85,170,255。即这幅图只能用这四个值来表示。那调整灰度级数的imadjust函数该怎么实现呢?

数字图像处理课刚好布置了一个作业,就是用代码实现灰度级调整。我在这里贴出我的代码,供大家参考参考。

说一说我的思路:比如一个灰度级256的图调整灰度为4,第一步我们就需要求出每个block的大小(也可以理解为256应该分为几个区间)。256 / (4-1) = 3个区间,每个区间size是85。然后我们再求出每个区间的中值,如果原图pixel值比这个中间值大,那他就属于这个区间的最大值,否则它就是属于上一个区间的最大值。

#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream> using namespace std;
void quantizie(cv::Mat& input_img, int level); #define LEVEL 2 int main()
{
cv::Mat img = cv::imread("41.png", 0);
cv::imshow("src", img);
quantizie(img, LEVEL); return 0;
} uchar get_value(int level, uchar v)
{
int block_num = level - 1;
int block_size = 256 / block_num;
for (int i = 1; i <= block_num; i++)
{
if (v > block_size * i)
{
continue;
} int mid_value = block_size * i / 2;
int left = block_size * (i - 1);
int right = block_size * i - 1;
if (v < mid_value)
{
return left;
}
else
{
return right;
}
} return v;
} void quantizie(cv::Mat& input_img, int level)
{
cv::Mat output_img = input_img.clone();
output_img.setTo(0); for (int i = 0; i < output_img.rows; i++)
{
uchar* p1 = input_img.ptr<uchar>(i);
uchar* p2 = output_img.ptr<uchar>(i);
for (int j = 0; j < output_img.cols; j++)
{
p2[j] = get_value(level, p1[j]);
//p2[j] = (p1[j] / range) * range;
}
} cv::imshow("quantize", output_img);
cv::imwrite("quantize.png", output_img);
cv::waitKey();
}

灰度级256

灰度级128

灰度级32

灰度级8

灰度级4

灰度级2

调整图像的灰度级数C++实现的更多相关文章

  1. C#中如何调整图像大小

    在本篇文章中,我将介绍如何在C#中来调整你想要的图像大小.要实现这一目标,我们可以采取以下几个步骤: 1.首先要获取你想要调整大小的图像: string path = Server.MapPath(& ...

  2. [译]Android调整图像大小的一些方法

    翻译自 某大神在Stack Overflow里的自问自答 (一般我们将Bitmap翻译为位图,但为了更好理解,在本文中我将它翻译成图像): 我们在开发的时候,经常需要从服务器中加载图像到客户端中,但有 ...

  3. Opencv实现图像的灰度处理,二值化,阀值选择

    前几天接触了图像的处理,发现用OPencv处理确实比較方便.毕竟是非常多东西都封装好的.可是要研究里面的东西,还是比較麻烦的,首先,你得知道图片处理的一些知识,比方腐蚀,膨胀,仿射,透射等,还有非常多 ...

  4. 调整图像的亮度和对比度—opencv

    1.理论基础 两个参数  和  一般称作 增益 和 偏置 参数.我们往往用这两个参数来分别控制 对比度 和 亮度 . 你可以把  看成源图像像素,把  看成输出图像像素.这样一来,上面的式子就能写得更 ...

  5. opencv——图像的灰度处理(线性变换/拉伸/直方图/均衡化)

    实验内容及实验原理: 1.灰度的线性变换 灰度的线性变换就是将图像中所有的点的灰度按照线性灰度变换函数进行变换.该线性灰度变换函数是一个一维线性函数:f(x)=a*x+b 其中参数a为线性函数的斜率, ...

  6. 基于FPGA的RGB图像转灰度图像算法实现

    一.前言 最近学习牟新刚编著<基于FPGA的数字图像处理原理及应用>的第六章直方图操作,由于需要将捕获的图像转换为灰度图像,因此在之前代码的基础上加入了RGB图像转灰度图像的算法实现. 2 ...

  7. (opencv08)cv.resize()调整图像大小

    (opencv08)cv.resize()调整图像大小 img = cv2.resize(src, dsize, dst=None, fx=None, fy=None, interpolation=N ...

  8. 如何在 HTML 中调整图像大小?

    了解在 HTML 中调整图像大小的不同技术.何时应避免在浏览器端调整大小,以及在 Web 上操作和提供图像的正确方法. 如果您的图像不适合布局,您可以在 HTML 中调整其大小.在 HTML 中调整图 ...

  9. 跟我学Python图像处理丨何为图像的灰度非线性变换

    摘要:本文主要讲解灰度线性变换,基础性知识希望对您有所帮助. 本文分享自华为云社区<[Python图像处理] 十六.图像的灰度非线性变换之对数变换.伽马变换>,作者:eastmount . ...

随机推荐

  1. zabbix邮件告警之 通过shell脚本发送告警

    说明:本文讲如何通过shell脚本实现zabbix发送告警邮件,共有5步1.设置mailx账号:是配置mailx的发信账号2.zabbix服务器端编写邮件发送脚本:是增加zabbix的告警方式,增加通 ...

  2. 工程部署从tomcat6.0迁移到jboss6.0错误总结

    2014-11-08 内容存档在evernote,笔记名"工程部署从tomcat6.0迁移到jboss6.0错误总结"

  3. permission denied (publickey)问题的解决 和 向github添加ssh key

    使用ssh key这种方式进行clone ,pull github上面的项目,使用 git clone或者git pull origin master出现permission denied (publ ...

  4. 【SqlServer】如何把本地SqlServer数据库部署到远程服务器上

    这里笔者使用的使用SqlServer2012,本机和远程环境均为Win7. 1.选中需要部署的数据库,右击>任务>分离.选中删除连接. 2.现在在左侧的表中就看不见刚才那个数据了. 3.在 ...

  5. win7 32位 安装opencv-python后,运行时提示 "from .cv2 import *: DLL load failed: 找不到指定的模块" 的解决办法

    安装opencv后,运行一个测试程序提示"from .cv2 import *: DLL load failed: 找不到指定的模块".于是百度一下解决办法,结果试了N多方法后也没 ...

  6. 使用grep恢复被删文件内容

    在Unix/Linux下,最危险的命令恐怕就属rm命令了,每次在root下使用这个命令的时候,我都要盯着命令行看上几分钟才敢把回车敲下去.以前,看到同事在脚本中使用rm命令 —— rm {$App_D ...

  7. MySQL中 optimize table '表名'的作用

    语法: optimize table '表名' 一,原始数据 1,数据量 2,存放在硬盘中的表文件大小 3,查看一下索引信息 索引信息中的列的信息说明. Table :表的名称.Non_unique: ...

  8. 记一次常规的Mysql数据库访问的时间分析

    背景:记一次常规的数据访问的时间分析(插入操作) 1. TCP三次握手 SYN ---> <--- SYN,ACK ACK ---> 花费时间: 386.718-385.784=0. ...

  9. [转]同一个tomcat不同项目的session共享问题

    问题描述: session常常用来存储一些公共信息供不同页面访问,比如用户登录信息.访问同一个tomcat下的不同项目所创建的session是不一样的.自然地面临了如何共享session的问题. 解决 ...

  10. python sort和sorted函数

    sort 与 sorted 区别: sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作. list 的 sort 方法返回的是对已经存在的列表进行操作,而内建函数 ...