2015年11月23日 星期一

资工三甲 林呈钰 04362383 hw3

Level and Curve

1.level
通过手动输入改变iInputMin iInputMax iOutputMin iOutputMax 的值,去改变图片的暗亮度。
需要注意的一点是:原影像色阶低于iInputMin的部分要通过判断语句让它等于iOutputmin,而原影像高于iInputMax的部分要通过判断语句让它等于iOutputmax,程式码如下:



当然,如果四个edit内没有输入任何数字,就会遇到问题,这时我设置当某个edit框未输入任何数字的时候,默认为0或者255。


当iInputMin从0变为50时,按下Apply按钮就会看到下面的图比原图更暗。(因为是上次在教室写的作业,留下来的图没有太多,所以例图效果不一定很明显)

2.Curve
实现在曲线图上点任意点改变曲线来修改图片,当然就要实现image的MouseDown事件,关于抛物线函数系数和坐标关系赋值的部分,我在这里就不写了,就把新坐标带进去就能得到关系式:  a = X;
      b = 255 - Y;
      T = (float)(b - a) / (a*a - 255*a);
      S = (float)(1 - T*255)
当鼠标任意按下确定新坐标,就将X,Y值带入上面四个式子,改变Curve;
最后一步是赋值,从而改变了原影像。
   




心得:
1.level
这个功能比较容易,因为只要知道推导公式,将 iOldLevel和iNewLevel 的赋值过程处理好,就可以了。只要上课听了老师将这个知识点和班上同学成绩水平类比的例子就能掌握这一知识;
2.curve
我也是在做作业的过程中突然领悟到 curve的大小要是255长度的正方形,而不能随意定。
为了让新坐标按下时明显一点我问了老师要怎么把点画出来,其实就是在X,Y附近坐标画一个圆再用颜色填充:
     Image3->Canvas->Pen->Color=clRed;
Image3->Canvas->Ellipse(X-4,Y-4,X+4,Y+4);
Image3->Canvas->Brush->Color=clRed;
Image3->Canvas->FloodFill(X,Y,clRed,fsBorder);
其实这个作业我用的时间比上一个作业直方图均化还要快,因为我类比这两个作业,编程式的整体思路是一样的:
       通过特定的公式设定新的值,然后遍历影像每个点赋值给原图像,在refresh图像就能实现功能。
当然这两个作业还都要求对画布的掌握要熟练!~
第一节课学的将图片反色的那三个回圈的知识,一直用到现在,其实真的是百变不离其中,只要懂本质,作业做起来真的不难,思路清晰了也就做的很快。










沒有留言:

張貼留言