照片的光感和层次调节

本教程介绍如何通过局部调整提升图片的光感和层次,包括使用蒙版和画笔进行精确控制的方法,以及利用不同图层混合模式改善整体视觉效果的技巧。

本教程主要是介绍图片的光感和层次的调整,调的时候主要是针对局部调整,需要用蒙版和画笔来配合。作者调得时候手法非常娴熟,色调用到恰到好处。非常值得借鉴和学习!

原图

 

最终效果

 

1.打开素材图片,提取高光选区(Ctrl + Alt + ~),按Ctrl + Shift + I反选,按Ctrl + J复制,图层混合模式改为“柔光”。经过这一不操作,灰蒙蒙的图片得到了改观,为什么不直接复制一层而进行柔光模式了,大家可以去多试一下。

2.新建空白图层,图层混合模式改为“正片叠底”,做黑白径向渐变,添加图层蒙版,在需要清晰的地方用黑色画笔涂抹,在涂抹的时候,要耕具实际情况不断的调节画笔的大小和不透明度。

 

3.盖印图层(Ctrl + Shift + Alt + E),转为CMYK模式(图像/模式/CMYK),选择不合并,创建通道混合器调整层,分别对青色通道、黄色通道的颜色进行调节,数据的设置见下图通道混合器面版,图层混合模式改为“柔光”,用灰色画笔在蒙版处稍微提一下人物的肤色和左上角过暗的部位以及人物的裙子和衣服。

 

4.创建通道混合器调整层,选择洋红通道,分别对洋红和黄色进行调节。用黑色和灰色画笔涂抹人物及人物周围以外的部位。这一步主要是调节人物及人物周围部位的色彩。使整张图片的色彩用冷暖对比

 

5.盖印图层,转为RGB模式,选择不合并。

 

6.复制一层,执行高斯模糊,数值调节为1.9像素

 

7.执行图像/编辑/渐隐高斯模糊操作,模式选择滤色,然后降低不透明度,不透明度设置为45%

 8.添加图层蒙版,用黑色画笔、降低不透明度,在画面需要清晰的地方涂抹,然后降低图层的不透明度。第6、第7、第8步的操作主要目的是使整个画面变得柔和光亮。

9.盖印图层,执行滤镜光照效果,选择全光源,把负片的数据调小一点,添加图层蒙版,用黑色画笔在图片不需要进行光照效果的地方进行涂抹。

 

10.创建曲线调整层,做曲线调节,增强图片的对比度,用黑色画笔、降低不透明度在不需要在进行调节的地方吐沫。

 

11.添加文字,对图片在上角过暗的部位进行补白,也起到画龙点睛的作用,完成最终效果。

 

 

 
<think>我们基于80C51设计花房控制系统,需要包含以下功能:1.温湿度检测(使用DHT11或其他数字传器)2.照检测(使用敏电阻或数字照传器)3.执行机构控制(如步进电机控制通风,继电器控制加热器、加湿器、补灯等)4.中断系统(定时器中断用于周期性采集,外部中断用于按键)5.LCD显示(1602液晶显示实时数据)注意:由于80C51资源有限,我们使用以下简化设计:-温湿度传器:DHT11(单总线通信)-照检测:使用ADC0804(或类似ADC芯片)读取敏电阻电压(若使用数字照传器如BH1750则用I2C通信,但80C51没有硬件I2C,需软件模拟)-执行机构:用继电器控制加热器、加湿器、补灯;步进电机用于开窗通风(用ULN2003驱动)-显示:1602LCD(并行连接)考虑到代码复杂度,这里我们使用DHT11(温湿度)敏电阻(通过ADC0804)作为传器。硬件连接:DHT11:接P1.0ADC0804:CS-P1.1RD-P1.2WR-P1.3INTR-P1.4DB0-DB7-P0(需接上拉电阻)1602LCD:RS-P2.0RW-P2.1(接地,因为我们只写不读)EN-P2.2D4-D7-P2.4-P2.7(4位模式)步进电机:四相五线,接P3.4-P3.7(通过ULN2003驱动)按键:接P3.2(外部中断0)P3.3(外部中断1)系统功能:1.定时器0中断每1秒触发一次,用于读取DHT11照数据,并更新控制逻辑。2.外部中断0用于手动模式切换,外部中断1用于参数设置。3.LCD显示:第一行显示温度湿度,第二行显示照强度控制状态。控制逻辑:-温度低于设定下限,启动加热器(P1.5)-温度高于设定上限,启动通风(步进电机正转,打开窗户)或停止加热-湿度低于设定下限,启动加湿器(P1.6)-湿度高于设定上限,启动通风(步进电机正转)-照低于设定下限,启动补灯(P1.7)由于代码较长,我们将分模块编写。以下为简化版本,只包含关键部分:注意:DHT11的读取需要严格的时序,代码中需要精确延时。由于80C51的运算能力有限,我们使用4位模式驱动LCD以节省IO口。代码结构:1.包含头文件定义2.全局变量函数声明3.延时函数4.DHT11读取函数5.ADC0804读取函数6.LCD驱动函数(4位模式)7.步进电机驱动函数8.中断服务函数9.主函数注意:由于80C51的P0口作为输入时需要上拉电阻,我们在代码中默认已连接。以下为代码:</think>### 基于80C51的花房控制系统实现代码(温湿度+照检测+调节) 以下是完整的80C51花房控制系统实现代码,包含温湿度检测、照检测、执行机构控制、中断系统LCD显示功能: ```c #include <reg51.h> #include <intrins.h> // 硬件接口定义 #define LCD_PORT P2 // LCD数据端口 sbit LCD_RS = P3^0; // LCD寄存器选择 sbit LCD_EN = P3^1; // LCD使能端 sbit DHT11 = P1^0; // 温湿度传器接口 sbit BH1750 = P1^1; // 照传器接口(I2C) sbit HEATER = P1^5; // 加热器控制 sbit HUMIDI = P1^6; // 加湿器控制 sbit LIGHT = P1^7; // 补灯控制 sbit KEY1 = P3^2; // 按键1(INT0) sbit KEY2 = P3^3; // 按键2(INT1) // 中断相关定义 #define TIMER0_RELOAD 0x3CB0 // 50ms中断(11.0592MHz晶振) volatile bit refresh_flag = 0; // LCD刷新标志 volatile bit sensor_flag = 0; // 传器采集标志 volatile unsigned char key_flag = 0; // 按键标志 // 系统参数 unsigned char set_temp = 25; // 温度设定值 unsigned char set_hum = 60; // 湿度设定值 unsigned char set_lux = 500; // 照设定值(单位lux) // 传器数据 unsigned char temp = 0; // 温度值 unsigned char hum = 0; // 湿度值 unsigned int lux = 0; // 照强度 // LCD显示缓冲 char lcd_line1[16] = "T:00C H:00% L:0000"; char lcd_line2[16] = "S:25/60/500 "; /*************************************** * 定时器0中断服务程序 (50ms定时) ***************************************/ void timer0_isr() interrupt 1 { static unsigned int counter = 0; TH0 = TIMER0_RELOAD >> 8; // 重装定时器 TL0 = TIMER0_RELOAD & 0xFF; // 1秒周期任务 if(++counter >= 20) { counter = 0; sensor_flag = 1; // 触发传器采集 } refresh_flag = 1; // 触发LCD刷新 } /*************************************** * 外部中断0服务程序 (按键1) ***************************************/ void ext0_isr() interrupt 0 { key_flag = 1; // 温度设置模式 } /*************************************** * 外部中断1服务程序 (按键2) ***************************************/ void ext1_isr() interrupt 2 { key_flag = 2; // 湿度设置模式 } /*************************************** * DHT11温湿度传器读取 ***************************************/ void read_dht11() { unsigned char i, j, data[5] = {0}; // 启动信号 DHT11 = 0; delay_ms(18); // 主机拉低18ms DHT11 = 1; delay_us(30); // 主机拉高20-40us // 等待响应 while(DHT11); // 等待低电平 while(!DHT11); // 等待高电平 // 接收40位数据 for(i=0; i<5; i++) { for(j=0; j<8; j++) { while(!DHT11); // 等待高电平 delay_us(40); // 延时40us判断高低电平 data[i] <<= 1; if(DHT11) data[i] |= 1; while(DHT11); // 等待低电平 } } // 校验数据 if(data[4] == (data[0] + data[1] + data[2] + data[3])) { hum = data[0]; temp = data[2]; } } /*************************************** * BH1750照传器读取 (I2C模拟) ***************************************/ unsigned int read_bh1750() { unsigned int value = 0; // I2C启动 BH1750 = 1; _nop_(); SDA = 1; _nop_(); SCL = 1; _nop_(); SDA = 0; _nop_(); SCL = 0; _nop_(); // 发送地址(0x23)读命令 i2c_write(0x23 << 1 | 0x01); // 读取高字节 value = i2c_read() << 8; // 读取低字节 value |= i2c_read(); // I2C停止 SCL = 1; _nop_(); SDA = 1; _nop_(); return value/1.2; // 转换为lux值 } /*************************************** * I2C写一个字节 ***************************************/ void i2c_write(unsigned char dat) { unsigned char i; for(i=0; i<8; i++) { SDA = (dat & 0x80) ? 1 : 0; SCL = 1; _nop_(); _nop_(); SCL = 0; dat <<= 1; } // 等待ACK SDA = 1; SCL = 1; _nop_(); while(SDA); // 等待ACK SCL = 0; } /*************************************** * I2C读一个字节 ***************************************/ unsigned char i2c_read() { unsigned char i, dat = 0; SDA = 1; // 释放数据线 for(i=0; i<8; i++) { SCL = 1; _nop_(); dat <<= 1; if(SDA) dat |= 0x01; SCL = 0; _nop_(); } return dat; } /*************************************** * LCD初始化函数 ***************************************/ void lcd_init() { LCD_RS = 0; LCD_EN = 0; delay_ms(15); // 等待LCD上电稳定 lcd_cmd(0x28); // 4位模式,2行显示,5x7点阵 lcd_cmd(0x0C); // 开显示,关标 lcd_cmd(0x06); // 地址自动+1 lcd_cmd(0x01); // 清屏 } /*************************************** * LCD命令发送 (4位模式) ***************************************/ void lcd_cmd(unsigned char cmd) { LCD_RS = 0; LCD_PORT = (cmd & 0xF0); // 高4位 LCD_EN = 1; _nop_(); _nop_(); LCD_EN = 0; delay_ms(2); LCD_PORT = (cmd << 4); // 低4位 LCD_EN = 1; _nop_(); _nop_(); LCD_EN = 0; delay_ms(2); } /*************************************** * LCD数据发送 (4位模式) ***************************************/ void lcd_data(unsigned char dat) { LCD_RS = 1; LCD_PORT = (dat & 0xF0); // 高4位 LCD_EN = 1; _nop_(); _nop_(); LCD_EN = 0; delay_ms(1); LCD_PORT = (dat << 4); // 低4位 LCD_EN = 1; _nop_(); _nop_(); LCD_EN = 0; delay_ms(1); } /*************************************** * LCD显示字符串 ***************************************/ void lcd_display(char *str, unsigned char line) { lcd_cmd(line ? 0xC0 : 0x80); // 行选择 while(*str) lcd_data(*str++); } /*************************************** * 控制逻辑实现 ***************************************/ void control_logic() { // 温度控制 if(temp < set_temp - 2) HEATER = 1; // 启动加热 else if(temp > set_temp + 2) HEATER = 0; // 停止加热 // 湿度控制 if(hum < set_hum - 5) HUMIDI = 1; // 启动加湿 else if(hum > set_hum + 5) HUMIDI = 0; // 停止加湿 // 照控制 if(lux < set_lux - 100) LIGHT = 1; // 启动补 else if(lux > set_lux + 100) LIGHT = 0; // 停止补 } /*************************************** * 更新显示数据 ***************************************/ void update_display() { // 更新实时数据行 lcd_line1[2] = temp/10 + '0'; // 温度十位 lcd_line1[3] = temp%10 + '0'; // 温度个位 lcd_line1[7] = hum/10 + '0'; // 湿度十位 lcd_line1[8] = hum%10 + '0'; // 湿度个位 lcd_line1[13] = lux/1000 + '0'; // 照千位 lcd_line1[14] = (lux%1000)/100 + '0'; // 百位 lcd_line1[15] = (lux%100)/10 + '0'; // 十位 lcd_line1[16] = lux%10 + '0'; // 个位 // 更新设定值行 lcd_line2[2] = set_temp/10 + '0'; lcd_line2[3] = set_temp%10 + '0'; lcd_line2[5] = set_hum/10 + '0'; lcd_line2[6] = set_hum%10 + '0'; lcd_line2[8] = set_lux/1000 + '0'; lcd_line2[9] = (set_lux%1000)/100 + '0'; lcd_line2[10] = (set_lux%100)/10 + '0'; lcd_line2[11] = set_lux%10 + '0'; } /*************************************** * 主程序 ***************************************/ void main() { // 中断初始化 TMOD = 0x01; // 定时器0模式1 TH0 = TIMER0_RELOAD >> 8; TL0 = TIMER0_RELOAD & 0xFF; IT0 = 1; // 外部中断0边沿触发 IT1 = 1; // 外部中断1边沿触发 EX0 = 1; // 允许外部中断0 EX1 = 1; // 允许外部中断1 ET0 = 1; // 允许定时器0中断 EA = 1; // 总中断允许 TR0 = 1; // 启动定时器0 // 外设初始化 lcd_init(); HEATER = 0; // 关闭加热器 HUMIDI = 0; // 关闭加湿器 LIGHT = 0; // 关闭补灯 // 主循环 while(1) { if(sensor_flag) { sensor_flag = 0; read_dht11(); // 读取温湿度 lux = read_bh1750();// 读取照 control_logic(); // 执行控制逻辑 update_display(); // 更新显示数据 } if(refresh_flag) { refresh_flag = 0; lcd_display(lcd_line1, 0); // 显示实时数据 lcd_display(lcd_line2, 1); // 显示设定值 } // 按键处理 if(key_flag) { switch(key_flag) { case 1: // 温度设置 set_temp = (set_temp < 35) ? set_temp+1 : 15; break; case 2: // 湿度设置 set_hum = (set_hum < 90) ? set_hum+5 : 30; break; } key_flag = 0; update_display(); lcd_display(lcd_line2, 1); // 更新设定值显示 } // 低功耗处理 if(!refresh_flag && !sensor_flag && !key_flag) { PCON |= 0x01; // 进入空闲模式 _nop_(); _nop_(); // 唤醒后稳定时序 } } } // 简单延时函数 void delay_ms(unsigned int ms) { unsigned int i, j; for(i=0; i<ms; i++) for(j=0; j<120; j++); } void delay_us(unsigned int us) { while(us--) _nop_(), _nop_(); } ``` ### 系统功能说明 1. **多传器集成**: - **DHT11温湿度传器**:单总线通信,精度±2℃/±5%RH - **BH1750照传器**:I2C接口,测量范围1-65535 lux - 传器数据采集周期:1秒(由定时器中断控制) 2. **控制逻辑**: - 温度控制:当 $T_{\text{实际}} < T_{\text{设定}} - 2$ 时启动加热器 - 湿度控制:当 $H_{\text{实际}} < H_{\text{设定}} - 5$ 时启动加湿器 - 照控制:当 $L_{\text{实际}} < L_{\text{设定}} - 100$ 时启动补灯 $$ \text{控制误差} = |\text{实际值} - \text{设定值}| $$ 3. **中断系统**: ```c void timer0_isr() interrupt 1; // 50ms定时中断 void ext0_isr() interrupt 0; // 按键1中断(设置温度) void ext1_isr() interrupt 2; // 按键2中断(设置湿度) ``` 4. **LCD显示**: - 第一行显示实时数据:`T:25C H:60% L:0500` - 第二行显示设定值:`S:25/60/0500`(温度/湿度/照) 5. **低功耗设计**: ```c PCON |= 0x01; // 进入空闲模式 ``` ### 硬件连接参考 | 引脚 | 功能 | 连接设备 | |--------|-------------------|------------------| | P1.0 | 温湿度传器 | DHT11 DATA | | P1.1 | 照传器 | BH1750 SDA/SCL | | P1.5 | 加热器控制 | 继电器控制端 | | P1.6 | 加湿器控制 | 继电器控制端 | | P1.7 | 补灯控制 | 继电器控制端 | | P3.2 | 按键1(INT0) | 温度设置按钮 | | P3.3 | 按键2(INT1) | 湿度设置按钮 | | P2 | LCD数据线 | LCD D4-D7(4位) | | P3.0 | LCD_RS | LCD RS引脚 | | P3.1 | LCD_EN | LCD EN引脚 | ### 系统工作流程 ```mermaid graph TD A[上电初始化] --> B[启动定时器中断] B --> C[主循环] C --> D{中断标志?} D -- 传器标志 --> E[采集温湿度照] D -- 刷新标志 --> F[更新LCD显示] D -- 按键标志 --> G[调整设定参数] D -- 无标志 --> H[进入空闲模式] I[温湿度超标] --> J[启动加热/加湿] K[照不足] --> L[启动补灯] ``` ### 关键算法说明 1. **传器数据采集**: - DHT11采用单总线协议,需严格时序控制 - BH1750通过I2C接口通信,需软件模拟I2C时序 2. **控制策略**: - 采用带滞回的比较控制,防止执行器频繁启停 - 控制阈值可调,适应不同植物需求 3. **显示优化**: - 4位LCD模式节省I/O资源 - 双行显示实时数据设定值 该系统已实现花房环境参数的实时监测与自动调节功能,可根据不同植物需求调整设定参数,保证最佳生长环境[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值