Archive.fm

The Bold Blueprint Podcast

The Bold Blueprint Avideh Zakhor even when times are tough

even when times are tough. Seek out mentors, friends, or a community that believes in your potential.

Broadcast on:
09 Oct 2024
Audio Format:
other

Hey Amazon Prime members, why pay more for groceries when you can save big on thousands of items at Amazon Fresh? Shop Prime exclusive deals and save up to 50% on weekly grocery favorites. Plus save 10% on Amazon brands like our new brand Amazon Saver, 365 by Whole Foods Market, Aplenty and more. Come back for new deals rotating every week. Don't miss out on savings. Shop Prime exclusive deals at Amazon Fresh. Select varieties. We wear our work day by day, stitch by stitch. At Dickies, we believe work is what we're made of. So whether you're gearing up for a new project or looking to add some tried and true work wear to your collection, remember that Dickies has been standing the test of time for a reason. Their work wear isn't just about looking good. It's about performing under pressure and lasting through the toughest jobs. Head over to Dickies.com and use the promo code workwear20 at checkout to save 20% on your purchase. It's the perfect time to experience the quality and reliability that has made Dickies a trusted name for over a century. Okay, are there any questions or comments from last time's lecture? Alright, let me start with a couple of announcements. This is a homework do on Friday. That's an enhancement. Then I've already started a dialogue with some of you about feedback on your proposals are meeting with a group of four right after class and then another group of three at 5.30 today. And for the rest of you, if I have any written comments or feedback, I will put it on the proposal and hand that back on Friday. For the most part, things look pretty good as far as when you guys are proposing. It might be a good opportunity next week for the spring break for you to to follow up on and do a good chunk of your your project. Why? Oh, because it's not a spring break. I got you mixed up with my kid. That's what he complains about. It's a break. Okay, so let's see. Let me has anybody finished the lab assignment for Friday? And how many hours was it? Is it five or 10 or 15? I say, I keep improving it. Okay, okay. So what I'm going to talk about today is wrap up the discussion on variations of median filter to remove salt and pepper noise. And then I'll move on to talk about removing periodic noises from images using frequency domain techniques. And and then I will continue on talking about frequency domain restoration techniques whereby we were trying to degrade some. We're going to we're trying to restore an image that's been degraded by some model by model of a system. And for today's, I think we'll have a chance to talk about the case where the degradation comes to the motion blur. And I think that's about what we'll cover. And then next lecture on Friday, I'm going to talk about winter filtering and inverse filtering. I think some of you have probably seen winner filters before, but we'll do a quick derivation of it anyway. Just as a show up hand so that I know to what extent I got to prepare, how many have seen winner filters derived before? One, reason one, two, three, four, five, six, so approximately half. Okay, so let's talk about, so the main topic were, let me bring in the chapter that I want to show pictures on. Okay. And we want to go to, yeah, it's number 14, 5, 14. Okay, so what we talked about last time was that if you have your signal, your image corrupted by additive white noise or additive gloss in noise or additive uniform noise, it just doesn't matter. Then ideally what you'd like to do is some sort of an averaging operation, which inadvertently it results in a slight blaring of the signal. Then the last thing we talked about last time was order statistics filter. In particular, we talked about median filter where you look at a neighborhood around a pixel, you rank order the pixels, pick the median and the value of the output is just that median. Then we talked about max and midpoint. In max, you pick the max value in min, you look, pick the min over the window, midpoint, you pick the half way between the max and min. Then we talked about alpha trimmed mean filters where you kind of remove the outliers and then you do some sort of an averaging. In the hopes that you can, a little bit, to some extent, remove the salt and pepper noise. The last class of order statistics filter that I'm going to talk about is adaptive, sorry, we talked about adaptive local noise reduction filter as well, in a sense that instead of applying a uniform rule across your entire image, if you have additive noise, what you can do is locally compute the statistics of the image mean or variance and accordingly change the signal according to the local statistics. In regions where the signal to noise ratio is high, that means the variance of the signal is high as compared to the variance of the noise, which you somehow magically have estimated, you want to let the signal go through. In regions where the variance of the signal is small, let's say in uniform back regions, but there's not that much activity in the signal compared to the noise level, then what you want to do is average or smooth out in order to get rid of the noise in that region. So to that, that was to get rid of the additive noise type situations, and for getting rid of salt and pepper noise as well, there's an adaptive technique where you can look at the local statistics of the signal before you do things, and that's what I'm going to talk about today. So the broad topic that we have at hand is image enhancement, and then within that broad topic, we're right now talking about spatial domain techniques rather than frequency domain, because we're going to talk about frequency domain later on, and then within the spatial domain, you have kind of additive Gaussian noise type techniques, and then you have salt and pepper type noise, and within salt and pepper, we've already talked about median type filtering in general, and what I'm going to talk about today is adaptive median filters. Okay, so I'll circle around it just to remind you that this is what we're going to talk about. Okay, and kind of the basic idea I'll explain it in just... Hey Amazon Prime members, why pay more for groceries when you can save big on thousands of items at Amazon Fresh. Shop Prime exclusive deals and save up to 50% on weekly grocery favorites. Plus save 10% on Amazon brands, like our new brand Amazon Saver, 365 by Whole Foods Market, a plenty and more. Come back for new deals rotating every week. Don't miss out on savings. Shop Prime exclusive deals at Amazon Fresh. Select varieties. We wear our work day by day, stitch by stitch. At Dickies, we believe work is what we're made of. So whether you're gearing up for a new project or looking to add some tried and true work wear to your collection, remember that Dickies has been standing the test of time for a reason. Their work wear isn't just about looking good. It's about performing under pressure and lasting through the toughest jobs. Head over to Dickies.com and use the promo code Workwear20 at Checkout to save 20% on your purchase. It's the perfect time to experience the quality and reliability that has made Dickies a trusted name for over a century. Two minutes and then I'll try writing down the rule that we use. So the basic idea is you want to be able to change the size of the window over which you're computing the median. And the basic motivation for doing adaptive median filters is that when you do regular median filtering, if the amount of salt and pepper noise is too high, the value of the median that you pick could very well be the value of the salt or the pepper noise itself. So what you want to do is avoid choosing the output of your medium of your filter is adaptive median filter being the the outliers, the salt and pepper kind of noise itself. So in words, in simple words, here's what here's the way one way to describe how this filter works. Basically you go around a pixel, let me first start giving some notation. So we're looking at the neighborhood Sxy around pixel x comma y. And this is kind of the notation that we use. Zxy is the pixel value at the center of Sxy and then Zmax is the maximum value of intensity over all the pixels that are in Sxy over that neighborhood that we're dealing with. And could you roll up, please? And then Zmin is the minimum value in Sxy and then Zmed is the median value in Sxy. So the gist of what we want to talk about is the gist of the this adaptive mean filtering approaches is like this. So here's an outline. Basically you want to keep increasing the window size until the following happens until Zmed is not an impulse. And I'll talk about not being an impulse in just a second. Mathematically, it means that the median value is in between Zmin and Zmax. So not an impulse means that Zmed is between Zmax and Zmin. Okay, you don't want your median value to equal Zmax and Zmin. And if in the salt and pepper noises, remember that we talked about the probability distribution of P of A and P of B, if P of A and P of B are very large, larger than 20%, for example, this could easily happen when you have a lot of salt and pepper noise. It could be that the median value that you choose equals the minimum in that window or it could be the maximum. So this is what we mean by not being an impulse. Okay, so the initial window size that you pick, let's say 3 by 3, might result in this happening. So if that happens, keep going your window. Of course, up to a point. I'll tell you what happens if you keep increasing it and if it becomes the entire image and you're out of luck. But for now, let's just keep increasing it. When that happens, in other words, when this not an impulse condition is satisfied, then check Z of XY. And you get one of two conditions. If Z of XY is not an impulse, and by now we already know what it means, then output Z of XY. On the other hand, if Z of XY is an impulse, then output Z-med. And the reason we cannot put Z-med is because based on condition A, because of here, Z-med is not an impulse. So the reason is because Z-med by definition, or by the virtue of the fact that we got to this point, is not an impulse. Right? Because we keep looping here until we make sure Z-med is not an impulse. And when that happens, we come to this portion and if the center point of our window is not an impulse, then that's the output. If it is an impulse, then this happens. So this algorithm is kind of descriptive. It's not very precise. So I'm going to refine that just a little bit more by writing it as a C-like or pseudo code, just so that because, for example, in this situation here, you can't keep increasing the window size until infinity. You've got to have some sort of a bound or limit. But nevertheless, writing it in this way makes it slightly easier to understand. So let me now, if you can roll up, please, let me now write down the pseudo code. And it goes like this. So there's part A and there's part B. And part A does the following. It says, if Z min a smaller than Z-med is smaller than Z-max, which is the same thing as saying in English, it's the same thing as saying Z-med is not an impulse. The median value of the region is not an impulse. Then go to part B. And you already started with some initial value for S of x, x, y. And we're kind of implicitly assuming S-max is the maximum size of window we're going to allow for this thing to grow. You can't just indefinitely grow it. Otherwise, else, if the window size that you have is less than S-max, we haven't reached that maximum, increase it by one. So window takes on the value of window plus one. In that case, repeat the, go to part A. Repeat checking. Repeat checking until you reach a point, the median value is not an impulse. And when you reach a point, I'm going to make sure to check out our new brand Amazon brand. Hey Amazon Prime members, why pay more for groceries when you can save big on thousands of items at Amazon Fresh? Shop Prime exclusive deals and save up to 50% on weekly grocery favorites. Plus save 10% on Amazon brands, like our new brand Amazon Saver, 365 by Whole Foods Market, a plenty and more. Come back for new deals rotating every week. Don't miss out on savings. Shop Prime exclusive deals at Amazon Fresh. Select varieties. We wear our work, day by day, stitch by stitch. At Dickies, we believe work is what we're made of. So whether you're gearing up for a new project or looking to add some tried and true work wear to your collection, remember that Dickies has been standing the test of time for a reason. Their work wear isn't just about looking good. It's about performing under pressure and lasting through the toughest jobs. Head over to Dickies.com and use the promo code WorkWear20 at checkout to save 20% on your purchase. It's the perfect time to experience the quality and reliability that has made Dickies a trusted name for over a century. Indian is not an impulse. Now come to part B and in part B we say that if Z min, if Zxy is not an impulse, in other words, it's between min and max. So this is saying Zxy is not an impulse. Then output Zxy as the output of the filter, else output Z-med. By the time we get to this point, because of how we got here, Z-med is not going to be an impulse. Now there's one other thing we have to consider here. If the window size smaller than X-max keeps increasing it, what if we hit the maximum size and we still couldn't satisfy this condition. In that case, just output, you have no choice but just output in Zxy. That's the best thing, even though the median keeps being an impulse, the best thing to do is if you're keeping the window size and the value of the median is the impulse, then just output the value of the point itself. For this one? Yeah, well, I would tend to think that actually there's a bit of a leeway how you want to do this, but if you output Z-med, you're guaranteed that you're output in an impulse, right? But at least when you do Zxy, there's some chance that you're not doing it here. We've hit the bottom type situation, right? In a sense that you keep increasing the window size and no matter what you do, the Z-med is an impulse, and now we've reached its max and Z-med is absolutely an impulse. So while it's possible that the book is using that, for the examples I've given, is using Z-med, to me intuitively, it seems like using Zxy is kind of a better idea. But this is kind of a last resort type situation. This is a case where you've grown the window, nor what you do, the median value is equal to the max and min, and so you're kind of out of luck. Okay, so let me show you some examples of this in action. So if you look at figure 524, I'm sorry, 514 in, by the way, Chris, the book also says output Zxy. No, mine says Ls output Z. Are you addition 1 or addition 2? What page are you looking at? 241, part level A, then mine says Ls output Zxy. It must be second, just look at your book in the front. Does it say second addition? Mine says output Zxy. Okay, to me, it makes a lot more sense to output Zxy anyway, because Z-med, we already discovered, it's going to be an impulse, and it's going to get us in trouble. At least Zxy, mine or mine not be. It's the least disruptive thing you can kind of do to your signal. Anyway, look at the pictures, what we have there, and why is this adaptive thing, and what situations do you want to use this adaptive median filter instead of regular median filter? Regular median filter works well if probability of A and B, if the level of salt and paper noise is small. When it gets to be too large, then you're really out of luck, okay? So in fact, of all the examples that Zxy, this is one impressive example. I mean, remember how I'm always skeptical, I say, oh, you can't tell the difference between the process, the non-processed, and it's canned, and it's artificial. This one is not, it's quite dramatic. Look at 514, so on part A, it's the same image of integrated circuit, not a printed circuit board that we've massively corrupted with noise. You can hardly look at the features, and just so that you can see what the original looks like, let me go back many slides back. Yeah, okay, so this is the original, okay? And look at these white dots around this circle. These are not noise, this is real signal, okay? And many of the techniques we've come up with, if they're not careful, they wipe those out, and we saw that last lecture. So now if you go to 514, we've added a ton of noise to that signal, and sure enough, it looks terrible. And this one happens if you do regular medium filters, 7x7 medium filter, and you can see that the white dots around this area are just gone. And if you do this adaptive business, you get this, which is incredibly clean compared to what we started off with, okay? So generally speaking, every time you do adaptive kind of processing, local processing, you end up gaining a lot. But what is the one drawback of adaptive stuff? Anybody? Yeah, CPU, because now over each region, you're examining the values of the piece of lead. For example, when you did adaptive mean filter, and you go to compute mean and variance, that's an extremely compute-intensive process. And if your goal is to process, you know, a 1000x1000 image in a fraction of a second, that puts a lot of requirements on how many gigaflops per second your machine has to handle. Furthermore, if the thing is coming at you at 30 frames a second or 100 frames a second, that's even more. So you really have to crunch numbers really fast. But generally speaking, in all image processing applications, every time you do things adaptively, you always end up gaining. Okay, that's all I have to say about about order statistic filters, about, and including spatial domain type processing. Any questions, comments, issues? Okay, so let me now move on to kind of the frequency domain techniques. So now we're again looking at image. Oh, sorry. The first thing I wrote here is wrong. It's not enhancement. We already did. It's restoration. Oh my God. Okay. So let me talk about image restoration, now frequency type techniques. And before I get into the details of, for example, leaner filtering and those other kind of classical type techniques, I would like to talk about the special problem and that's the periodic noise case. So if you have a periodic noise, is it surprising to you that you would want to get rid of it in the frequency domain? No, and why not? What can we say about periodic noise? That's right. Periodic noise, but what Chris just said is that if you have periodic noise, it results in a spike in the frequency domain, which is exactly true. For a periodic signal, the Fourier transform is a delta or rather you have Fourier series expansions. And so you have these peaks sticking out in the frequency domain. And therefore, if you just take the frequency, the Fourier transform of the signal, you see where those peaks are. And then what do you do? Well, we've learned all these massive number of techniques to design 2D filters. Then you design a 2D filter that, let's say a band stop filter or a notch filter that just removes those spikes as we needed them. Kind of like in one dimensional signal processing, when you have like 60 hertz noise due to the power line in the middle of any of your signals. It could be your wireless, your disk that, or actually, I bet you almost all of our appliances at home, somewhere in them have a notch filter that rejects 60 hertz. In other words, you see your television picture messed up, audio for your radio will be messed up, etc. In any event, so every time you have periodic noises, because the occurs from the spikes in the frequency domain, you can easily remove them. And I don't want to make a terribly big deal out of this technique. It's not other than talking about optimum notch filter, which I'll do a derivation in just five minutes. But I'll just show you some examples of filters and images that have been corrupted with periodic noise. So the first few examples are kind of canned. The guy starts with the picture. He slams periodic noise on it. The periodic noise has this really nice evenly spaced pattern in the frequency domain. It's very easy to figure out what filter to design and the results look good. And then after that, there's a real life example of a picture from Mars that has been corrupted by the periodic noise due to the scanners, the electromechanical stuff in the scanners, due to the electronic circuit, which generates periodic noise. And that's a real example that he's worked on, and I'll go over the derivation of that. So here's some examples of this guy called the band reject. I always call it band stop, but band stop filters. So this is an ideal frequency response. Let's say it's a circle that, the frequencies in that circle is where we're rejecting the signal and everything else we're passing through. And this is an ideal. And then this is if you use Butterworth and this is if you use a Gaussian, not really too deep or anything exciting about it. So here's an example of an image that's been corrupted by sinusoidal noise. And I truly believe he doesn't really say it, but I think this is pretty much a canned example. He started with a clean image. He added this sinusoidal noise on top of it. On the upper right, what you see is the Fourier transform of the signal. And again, I don't know whether it shows up on the TV screen, but if you're looking at the book, this is a white dot. This is a white dot, white dot, white dot, white dot. These are the delta functions in the frequency domain. Does it come across in the screen on TV? It does? I couldn't see from where I'm sitting. Oh, no, it does. Okay, part of my problem also is the angle is not very good. Okay. And here is and here is the kind of the frequency response of Butterworth filter that he applies. And this is applying that to the signal. And what you can see is, wow, what an improvement, right? But this was something he added. This was something he added, right? Canned example. And if you look at the signal that the filter caught, this is the noise pattern that was superimposed on top of the original signal. It's a sinusoid. Sin of omega 1 times x plus omega 2 times y, and he added that on top of the signal. A, so generate the space domain signal. A sin of omega naught x plus omega 2 y, or, no, it's the space domain signal. So let me come back on the camera. So it'll be it'll be if you can come back on the paper here. So you add, you have the, you have the observed, now you have the clean signal, f of x comma y, and you add some A sin of omega 0x plus omega 2 y, right? And in order to, yeah, you can make a sine, cosine. You can have the negative frequencies as well, etc. Generally speaking, in the frequency domain, omega x, omega y, if you wanted to add a spike here, if you wanted your signal to remain real, you would have to add a spike in the conjugate symmetric part as well, right? Otherwise, you end up with a imaginary noise added, and we all know that in many applications, that just doesn't happen. Yeah? Did that answer your question? Okay. Okay. Any other questions? Okay. So, so, so in this case, if you go back, I mean, he added this complex pair that's one sinusoid, and then this one, that's another two, this one, and that's three. So he added three pairs of sinusoids, and you know, it's a canned example. Those dots are exactly where he added them, but it's not surprising. And just, just to give you a little story, when I was a graduate at MIT, Trosos Papas, who was a grad student, and now, by the way, he's a professor at Northwestern, used to be working with Jay Lim to, for all the examples in his book. And, you know, and at that time, I guess it just shows my age, we didn't have, we didn't have monitors that could show images, let alone color, but it's just an even gray level images you couldn't buy any. So, we had a device called AED. It was in the middle of the computer room. We were all forced to be in a computer room, because if you wanted to look at images, you had to be in the room where you have a display device to look at images. And, you know, we would all be sharing it, I'll throw an image, look at it, and my algorithm still didn't converge, or we pull my hair out, and Trosos would be throwing images for Jay Lim's book on the screen. And he would just be complaining. He said, "I can't believe I'm spending my life doing this, these are all canned examples. I start with an image, I add no, I don't move it, then I look at it." And that's what goes into the book. So, he complained a lot about the canned examples. And that's kind of what I'm saying here, is that, I mean, the guy added canned noise on top of this, and you remove it, and of course it's gone. There's nothing surprising about it. But in his defense, the next examples are less canned. So, you can also do, instead of bandstop filters, you can do a notch filter. A notch filter means that this is a particular omega x, omega y value that you just want to remove. And so, ideally speaking, let's say you want to remove these two guys. Or, if you're designing real life filters like Butterworth or Gaussian, then you get frequency responses like that, which is not a big deal. And of course, the challenges, these examples the guy shows is not that canned, in a sense, that if you design your Gaussian filter to have a wide region here, a wide base. Hey Amazon Prime members, why pay more for groceries when you can save big on thousands of items at Amazon Fresh? Shop prime exclusive deals and save up to 50% on weekly grocery favorites. Plus save 10% on Amazon brands, like our new brand Amazon Saver, 365 by Whole Foods Market, a plenty and more. Come back for new deals rotating every week. Don't miss out on savings. Shop prime exclusive deals at Amazon Fresh. Select varieties. We wear our work, day by day, stitch by stitch. At Dickies, we believe work is what we're made of. So, whether you're gearing up for a new project or looking to add some tried and true work wear to your collection, remember that Dickies has been standing the test of time for a reason. The work wear isn't just about looking good. It's about performing under pressure and lasting through the toughest jobs. Head over to Dickies.com and use the promo code Workwear20 at checkout to save 20% on your purchase. It's the perfect time to experience the quality and reliability that has made Dickies a trusted name for over a century. You've removed a lot of the signal frequency itself. And ideally, you don't want to design filters that are sharp and narrow and approximately this ideal thing as much as possible. That's a different story. I've got a question. If for image processing, why would you not use ideal filters every time? Oh, you can't design it. You can't design it. Just do it in frequency space and define it how you want, right? No. That's a good point. That's a confusing point for a lot of DSP students. Let's come back here and let me try to answer that. So, your thinking is that, remember, omega x and omega y are continuous real variables. So, let's, for simplicity, let's just talk about low pass filter, right? So, an ideal low pass filter, that's 1 here and 0 here. The impulse response for that, that was assignment 1, way back when, is a complicated Bessel function thing that's an infinite impulse response. In fact, we can even have this discussion in 1D. It's even simpler to explain it. Yeah, let's just do it. Yeah, the idea of frequency, the ideal impulse response goes on forever and it's an IIR and it's not one that it can be approximated with a rational transfer function. So, what you might be thinking about, and you need to clarify that in case you are thinking about that, is you might be thinking, well, you know, if, if I, if I have a, you know, 512 by 512 image and I computed its DFT values and I noticed the, the DFT of the signal in here, why not just set the middle ones to 1, keep them, and that's not an ideal filter. You know why? Because, essentially, you've multiplied it by h of omega x and omega y with samples of omega x and omega y on that 512 by 512 grid are 1 and 0. But the, the, the, if I compute the impulse response of this filter in time domain and then truly compute h of omega x and omega y at, I don't know, not 512 by 512, but 5,000 by 5,000, what you will find is that, yeah, it's, it's kind of one here and then it transitions into, into zeroness here. This thing is, is a function of omega, it's omega x and omega y, these are real variables. So, what samples of it could be 1 and 0 in between the samples, if I were to infinitely, finally plot h of omega x omega y, it wouldn't, it wouldn't match the ideal. Oh, it surely does. Essentially, if you do this what you just did, you've, you've applied what technique, you've applied what's called frequency sampling technique in order to design your FIR filter. And that might be, first of all, the resulting filter that you get is 512 by 512, which is incredibly big. And secondly, at the end, it's not the ideal filter either. In fact, frequency sampling is one of the, I would say, I wouldn't want to say dumbest, but we're of the least effective way of designing FIR filters. It's very simple. I mean, essentially, you don't have to design a filter. You take the FFT of your signal, keep the coefficients in the middle, set everything else equal to zero. You have low pass filter, there's no question about it. So, you could, you could argue that there was no computation involved, right? But in terms of, you know, band limiting the signal, you might have done, you know, first of all, if you did it in the space domain and, and you designed a 9.7 by 7 or 5 by 5 space domain signal, you can avoid taking the 2.4 year transform, which could be very time consuming. And second of all, you could have just as effective of a frequency response. Well, you might be able to have a nice frequency response for it anyway. Does that answer your question? Yeah. So, so, so that's the reason ideal low pass filter doesn't, or ideal any pass filter doesn't really exist, because it corresponds to an infinite impulse response, which cannot be approximated with even rational transfer functions. And, and therefore. No, it wasn't. You mean this, this example? Can you switch back to the computer, please? This, he's just visualizing. This one? This one? No, it's just a graphical representation of his specs for his, no, it's not the real impulse. It's, it's very misleading, but it's not that. Okay. This is, this is more like what he has, either this or that. And, and the reason he shows this is just kind of idealistic thing. This is ideally what we would only want it to look like. Okay. Yeah, it is a source of, I would say not only confusion, but also disappointment. It was for me, when I was a student, is I'd, I'd learn that with DSP, you could do this ideal filter and have infinitely sharp filters. And, and it was very disappointing to find out in like maybe the second or third lecture that, that none of that was true, in fact. And that, that, yeah, if you, if you let your sink go to infinity and you have infinite samples in your, in your filter, yeah, you can approximate that, but you really have to go to infinity to have this sharp, sharp, sharp behavior. As, as long as you don't go to infinity, you have this smooth kind of a behavior. Okay. Okay. So, so then you can talk about these notch filters, again, this is ideal representation. This is actual ones with Butterford and Gaussian. And here's an example of, of a, of an image that's been corrupted by this kind of a noise, horizontal scan line kind of a noise. And again, I don't see, I see it on my screen. I don't know if you see it on your screen. There's, there's horizontal streaks here. Do you see that? No. You do? Let me, let me get it. No, I, I don't, I don't see it on the screen. But if you look at the book, and, and if you're sitting next to neighbors who don't have it, maybe pass along your book to, to the neighbors to share it, there's, there's horizontal, it's not as dramatic as the other example. So here's a four-year transform of this. Here's kind of the approximation of the, of the filter that you want to, because it's horizontal streak, you want to have a filter that cuts out this and cuts out that. And if you do that, you can get the noise pattern. And if you apply it to this, you can, you can kind of remove the noise pattern question. Yeah. So like following what he was just saying, so if you really actually did apply some sort of wrecked type of thing in frequency space to get rid of these vertical lines versus what the quote unquote optimal would be, which is some smoothed out version of some wrecked thing. How's the image going to look different? Is it going to have like some ringing type of features or what? This, this thing where, where you've put zeros for these coefficients, right? Whatever the dimension of the images is it like 512 by 512 as an example. This, this would be an equivalent of a 512 by 512 FIR filter, which is fine. Yeah. Which essentially it amounts to setting this equal to zero. And how would that compare to what? A Gaussian filter that was 512 by 512, or how would that compare to a Gaussian filter that was, I don't know, 7 by 7? All right. What you have to understand is, if you, if you are taking the step, the trouble of computing the 2D Fourier transform, you're right. Both of you are right. It's just as easy to set this coefficient to zero and we're done. It's as if we did a 512 by 512 filter. But if you didn't want to do that step of computing the 2D Fourier, I mean, in this case, it's an educational thing. I'm showing you the Fourier transform because I want you to see what's going on, right? In real life, taking a 512 by 512, 2D Fourier transform is not terribly cheap operation. I mean, if you want to do it one image and it's very cheap, but it depends on your application of what's cheap and what's not cheap from a CPU point of view. And if you want to stick to space domain kind of computations, which in this case, actually, this is a frequency domain lecture already, but if you want to stick to space domain computation, you can design much better 7 by 7 filters by designing it properly than the inverse of a 7 by 7 frequency sampling filter. Do you see what I'm saying? Yeah, I completely follow you. I was just thinking that with these type of images where you're trying to remove some type of periodic noise, it seems like you're going to need to look at the transform anyways to see where the stuff's at. That's very true. So then you might as well, you can just as well set the frequency, the coefficients equal to zero and not bother with designing a Gaussian. Exactly. And if in some God given way, you can look at the picture and say, oh, I know what the things are. Then by all means, you can stick to this space domain and not to go out to all these troubles. Just to set a curiosity, how many of you, I guess for your homework, you guys must have done this already. How long does it take you in MATLAB to compute a 512 by 512 transform? A second. Okay. So not that long. Okay. All right. So next, I'm going to talk about an example of periodic noise where it's not canned. So in this example, there's an image of a Martian terrain taken by Mariner 6 from JPL. And we have this image here that has this periodic pattern superimposed on top of it. And now, because this is a real life example, when you take the Fourier transform of it, you know, you don't have eight dots equally spaced upon some circle. Now you have spikes here, here, here, here, here, and kind of all over the place. But you don't, it's not a clean kind of a thing. And so the question is, how do you go about removing those? Okay. So coming back to the paper here. So the question that we're trying to ask us is, what if the interference pattern is not, and I call it clean, in other words, is not like eight things in a circle? For this periodic noise case, how do we deal with that? And again, sources of possible sources of these periodic interference patterns, at least for example, in this example that we've shown is the coupling and amplification of low-level signals in electro-optical scanners, electronic circuitry. So every time you're scanning, for example, you're generating some periodic noise somewhere in your electronic circuit, that's causing the periodic noise. So how do we go about doing this? Well, our approach is not terribly different. It's going to involve some intuition, first removing the noise, but then doing something a little bit extra. So the approach that we take is a first two-step approach. First, isolate the principle contributions of the interference pattern. By principle contributions, I mean the spikes. Again, that involves eyeballing in the frequency domain and looking at it and picking it out. And then because this is kind of a now, we don't have a clean pattern, there might be some components that we just missed out. So we have to do, it would make sense to do a little bit of a cleanup after this eyeballing step, after this approximate step of saying, "Oh, okay, it seems like there's a pair here, there's a pair here." But unlike the synthetic example, there were eight things on a nice circle which was removed, this thing is a bit more messy. So we might not, in the first step, we might not have removed all the periodic interferences that we could have done. So the second step is, we subtract a variable weighted portion of the pattern from the corrupted imagery. Okay. And in the process of doing so, we try to kind of optimize something. And what we tend to optimize, if you've got periodic noise, is to try to minimize kind of the local variance in the processed image. And now I'll get to that in just a second. And so we try to come up with some sort of an objective, i.e., or e.g., whatever you want to say, minimize local variance of the processed image. Okay. So once again, the notation that we use and the kind of the setup that we have, great, is as follows. We call it g of x comma y, which has the Fourier transform g of omega one and omega two. This is our observed signal, observed degraded kind of signal. And then the process, the f of x comma y, is the, which corresponds to f of omega one and omega two is the clean signal that we wish, that was the original or undegraded. Many times you just don't have access to that. It's kind of a fantasy. And then f hat of x comma y, which has f hat of omega one and omega two, as it's Fourier transform, is the processed version. Hey Amazon Prime members, why pay more for groceries when you can save big on thousands of items at Amazon Fresh? Shop Prime exclusive deals and save up to 50% on weekly grocery favorites. Plus save 10% on Amazon brands, like our new brand Amazon Saver, 365 by Whole Foods Market, a plenty and more. Come back for new deals rotating every week. Don't miss out on savings. Shop Prime exclusive deals at Amazon Fresh. Select varieties. We wear our work, day by day, stitch by stitch. At Dickies, we believe work is what we're made of. So whether you're gearing up for a new project, or looking to add some tried and true workware to your collection, remember that Dickies has been standing the test of time for a reason. Their workware isn't just about looking good. It's about performing under pressure and lasting through the toughest jobs. Head over to Dickies.com and use the promo code Workware20 at checkout to save 20% on your purchase. It's the perfect time to experience the quality and reliability that has made Dickies a trusted name for over a century. Of G that approximates, that's twice to approximate F. So you start with your signal F. It goes through some sort of a degradation, in this case periodic noise, and you get G. And then you process G somehow to get F hat. So this F hat tries to be as close as possible to F. And this is the box that we're trying to design. Question mark, question mark. What should go inside this box so that this F hat that comes out is as close as possible to F. And so, and again, we'll come back to this set up again and again when we deal with renal filtering or inverse filtering or various other things in future lectures. But for now, if you can roll up please, what can we, what is the two steps that we're going to take? So step one is just put a notch filter at location of each one of the spikes. Put a notch filter, which is H of omega 1 and omega 2 at the location of each spike. And so, so actually it's kind of the, the opposite of a notch, so it's not rejecting that frequency where the, where these things are, but it's kind of passing those through. So in other words, I'm going to, I'm going to find the filter H, H of omega 1 and omega 2. So that the, the Fourier transform of noise is H of omega 1 and omega 2 times G of omega 1 and omega 2, okay. So now this has all the noise. All the noise that we visually, we looked at the Fourier transform, which is what we showed on the screen a minute ago. We've, we've designed the filter that passes those spikes and we process the original degraded signal G by that filter and now we get a signal that has the, the Fourier transform of the noise. And now if you take the inverse transform of it, what you get is it's inverse for A dot of x comma y, which is the noise in the space domain. It's just the inverse Fourier transform of H of omega 1, omega 2 times G of omega 1, omega 2, okay. And what I'm basically proposing to do is, so this is step number one. We've, we've approximated, we've eyeballed where the spikes are and we've, we've designed some sort of a filter that lets those signals through and, and, and cuts off all the other part of G. So now we have an estimate of the noise, right. And then the next step, if you can roll up a little bit, so step two is what I just said earlier, which is somehow this might not have caught all the periodic patterns. So what we're going to do is try to remove a weighted average or a weighted portion of this noise from the original signal. So we're going to come up with f hat of x comma y is the, this the original observed signal G minus A dot of x comma y, which is the noise, except that we weight the noise by this weight function, W of x comma y, okay, this weight function. And, and you might say, well, how do I pick the weight function? Well, this happens all the time in computer vision and image processing. What is the best value for my weight? Oh, let's try to minimize some criteria, optimize some criteria. And what criteria do we minimize? There's as many criterias in the world as there's people, right? And so there's some generally accepted one that people use. And what do we want to say? Well, let's minimize the local variance. Let's pick these weights to be spatially varying, but at each region, we're going to pick it so that the local variance of the processed image f hat is minimized. So solve the following optimization problem. Choose these local weights of W of x comma y to minimize the local variance of f hat at x comma y. And, and, and could I have picked a different optimization carrier? Sure. Would I have gotten good results? Probably. Is there one best optimization technique? No. Question, question. I'm just curious, like, it seems like most of the noises we're, we're worried about are, are pretty high spatial frequency. Like, and it seems like it would be hard to remove some noise that was kind of buried within the sort of central low frequency. In the frequency domain, it would, definitely, right. But, but there, how about these ones? Can you switch back to the, to the computer, please? How about, how about these guys? I mean, it's kind of like a continuum, isn't it? It's not like the signal ends. Okay, now the, the noise begins. How about this guy? It's kind of close, but not quite. How about this guy? It's kind of close, but not, not quite. So, so the reason for step number two is to kind of clean up the mess or, or take care of the ones that we didn't really fully take into consideration in step number one. So, come back to the, to the paper. And, and so how does, how does this approach work? Well, now we can, now we can just set up this optimization problem. What's another important computer vision image processing problem where people applied this, this smoothness constraint and got their solution. You know, birth of horn in the 80s, when he came up with the optical flow problem, he had to come up with constraints or optimization problem, because the problem he was solving was under, under determined. That's the word. And so, what he had to do, and a lot of times in image processing, this is called regularization. It's a very powerful technique. We'll come to it over and hopefully, over and over again, throughout the rest of the course, where you're solving something and, you know, the solution doesn't really stand out. So, he said, oh, I'm going to minimize or optimize something. And, so what thing are we going to minimize? And many times, what you pick as your minimization criteria or optimization effects what the final signal looks like. But, but this is a very powerful technique. This is used almost all the time. And, and smoothness criteria is, is one thing that people use over and over. And, in this case, it's, it's a local smoothness criteria. We're minimizing local variance of F hat. And, why are we doing that? Intuitively, doesn't make sense. It kind of does. If you, there's a periodic noise and high frequency and makes my F hat, my reconstructed F hat, which is supposed to be close to F, have, have high local variance that means have lots of high frequency. Let me smooth it over. Let me, let me, let me, let me subtract the noise from it, but, but, but pick a weight that, that, that, in such, that's chosen in such a way that, that smooths out the final image, F hat. And so, how do we go about doing that? It's a straightforward optimization problem. You write down the expression for F hat, and then you, you, so, you write down the expression for the local variance of F hat, then you take the derivative of that with respect to W, it said that equal to zero, and that gives you the, the W. And so, let me just go through those steps really fast, and it's, it's all in your book. So, the neighborhood that I'm going to consider is 2A plus 1 by 2B plus 1. So, for each, for each pixel, I'm going to assume that, that, that I'm, I'm going to, for each region like that, I'm going to compute the local variance, and that's the thing I want to minimize. So, what is the local variance over that neighborhood? Well, the expression for it is, is pretty straightforward. Sigma square of xy is 1 over 2A plus 1 times 2B plus 1. Variance is what? The value minus the mean squared averaged over. So, this is averaged over. Summation of s from minus a to plus a, t from minus b to plus b of something squared, and what's that thing squared? Well, it's F hat of x plus s comma y plus t, minus F hat bar of x comma y. So, you compute the mean over the region. And this is F hat bar, and subtract every pixel from the mean, squared over, add it up, divide by the number of pixels, and that's the local variance. And let me just, for completeness, let me roll up, please, write down F hat bar, which is the local mean. F hat bar of x comma y is given by kind of a similar thing. It's 1 over 2A plus 1, 2B plus 1. Summation s from minus a to plus a, t from minus b to plus b of just F hat of x plus s comma y plus t. And now, I can, this is the thing I want to minimize, right? And I have this F hat, and I want to minimize it with respect to the weights, but how do I relate this to the weights? Well, come back here, right? This is the weight equation, this is F hat relating to the weights, and this is sigma squared that I want to minimize, that has F hat. So, what's the next natural thing to do is plugging this for F hat here, plugging these g minus w times eta. So, essentially, what I want to do is plug in this guy, F hat equals g minus w eta into this sigma squared xy expression. And, oh, it becomes a really messy thing, and to save time and energy, I want to write down the big messy equation. But in the process of doing that, after I do that, I'm going to assume that my window is constant over this 2a plus 1 by 2b plus 1 region, okay. So, in other words, after I plug this thing, in other words, wx plus s comma y plus t is approximately equal to w of x comma y for s and t in the minus a to plus a region, and minus b to plus b region. So, because otherwise, this becomes a horrendous set of computations. And after I do that, then, and I make this assumption, and I plug this expression into this expression, I get the following thing as my variance. Sigma squared of x comma y is 1 over 2a plus 1, 2b plus 1, 2 summations minus a to plus a minus b to plus b of the following thing squared. And the following thing is g of x plus s comma y plus t minus w of x comma y, a to of x plus s comma y plus t minus square brackets minus another square bracket, g bar of x comma y minus w of x comma y, a to of x comma y. Oh, really complex, but the beauty of all of this thing is if I now take the derivative of this with respect to wxy, because it's only quadratic in wxy, right. Here's linear, here's linear, subtract each two things square. So, if I take the derivative is 2 times this times the derivative of this thing with respect to xy, which is just this one and this one. Set that equal to 0, it's very easy to solve a linear system to get the answer. So, d sigma squared xy over d wxy equals to 0. And what I get is that this weight w of x comma y is given by this expression. g of x comma y bar, which is times a to of x comma y bar, which is the average of these two things, minus g bar of x comma y, a to of x comma y, over a to square bar of x comma y, minus a to of x comma y. So, these are the weights that we compute. So, I'll give you a chance to copy before I start commenting on this. These are the optimal weights. So, what does this all mean? Well, do we have access to all these signals that I've put down here? We kind of do, right? g is our observed signal. That's the thing that sends the final sensor, like from the Hubble telescope or whatever it was. Hey Amazon Prime members, why pay more for groceries when you can save big on thousands of items at Amazon Fresh? Shop prime exclusive deals and save up to 50% on weekly grocery favorites. Plus, save 10% on Amazon brands, like our new brand Amazon Saver, 365 by Whole Foods Market, Aplenty and more. Come back for new deals rotating every week. Don't miss out on savings. Shop prime exclusive deals at Amazon Fresh. Select varieties. We wear our work day by day, stitch by stitch. At Dickies, we believe work is what we're made of. So, whether you're gearing up for a new project or looking to add some tried and true workware to your collection, remember that Dickies has been standing the test of time for a reason. Their workware isn't just about looking good. It's about performing under pressure and lasting through the toughest jobs. Head over to Dickies.com and use the promo code Workware20 at checkout to save 20% on your purchase. It's the perfect time to experience the quality and reliability that has made Dickies a trusted name for over a century. ADA, we just estimated it in step one. Remember, those are step one. By eyeballing, we kind of estimated age and then we process the signal of age to get the signal. No, it's N, which is, and then pull your transformer and this is ADA. So, we know ADA. And so, these are just statistics of G and ADA. And I hope you all know why G, ADA bar is different from G bar and ADA bar, right? Everybody knows that. So, having shown that, let's not see. So, this was a real example. It wasn't a canned one. Let's see how well this technique performs. So, this is the spectrum of the same image that was here. But here, the origin is at zero. Now, he's moved the origin here. I wouldn't sweat too much time on that. This is the Fourier transform of N. This is the original signal after we pass those spikes that we hand picked through. And this is the space domain signal. The inverse Fourier transform of the noise, this is ADA of X comma Y. And this is N of omega 1, omega 2. Okay? That's the pattern. And so, we have that and we have G, which is here. So, using G and using ADA, we can not compute optimal weight for each 2A plus 1 by 2B plus 1 neighborhood in order to, A and B, in this case, are chosen to be 15 in order to get this signal. So, this is the process image. So, compare this, keep it in mind, to the original, this. You can see there's a, at my screen, there's a lot more periodic patterns all over here. There's kind of a screening pattern going on. Compare this to that. And it doesn't really help that the size of these images are different. Okay? So, pretty much you remove the periodic pattern, which in this case wasn't the simple kind of spikes. Any questions? By the way, these minimization techniques are particularly helpful when what happens. Every time you want to minimize something, what do you do? You set the derivative equal to zero. And if you set the derivative equal to zero, you get a monster that you can't really do anything with. You stop. You can't move forward. So, a lot of time, you might ask, you know, what criteria should I minimize? Yeah, we can sit here and we can talk to some of these vision science guys. And they tell you, oh, they are minimizes this function. It's so complicated. And if you wanted to try to minimize, maybe something complicated, the problem is, it wouldn't be a simple second order thing that when you take the derivative, it's the first order thing, and the answer comes right out of something simple like this, if you can go back to the picture. See, so, many times in science and engineering, how you get to your answer is a function of two things. What assumption can you insert? Can you make about the situation you have at hand? You know, in this case, what is it that we should minimize? Yeah, minimizing local variance is good. But also, the second, but just as important step is, if I make that assumption analytically, does it become something tractable that I can, for example, set the derivative equal to zero and get an answer? Or would it have been a complicated numerical optimization technique where I have to do nonlinear optimization and down in values and peaks and apply simulated and kneeling and all those other things? So many times, not just an image processing in physics and lots of branches of science and mathematics, you're after solutions that a model reality, good things to approximate, in case we were saying we want to minimize local variance, that's a good thing, and b, they're tractable, because otherwise you can't get an answer. And then many times, a thesis or a project is about moving about these points. Okay, now I'm going to make my model a little bit more complicated. It reflects reality a little bit more, but it's and literally a little bit harder to track. But let me just see what I get. And what you want to do is kind of trade off between these and say, well, you know, I made my mother 10 times more complicated and the resulting image, it takes longer to optimize, but the resulting image is just, you know, ever so slightly better, I can't even see that much. So these trade offs help you help you decide what are good operating points, if you will. Okay, any questions or comments? Okay, so I'm going to just move on to the rest of the restoration stuff and come back. And so one of the things that is useful in restoration is, so again, I'm going to draw kind of the generic boxes that we've been using. F is the original, it gets degraded, outcomes G, this is what we observe. We pass it through a box, which is the restoration box. And then what comes F had and we're trying to make F had close to F. This is the picture I want you to keep remembering about restoration. And in our particular situation, we're going to make some assumption about the degradation. Again, just like I said, we better make assumptions that make the resulting problem tractable. Otherwise, we're out of luck. We get stuck very quickly. Actually, another field that this happens all the time is what in control theory, and what do the control people do all the time? Make assumptions to make the problem tractable. They assume the thing is what? Linearity, they assume everything is LTI. And then when they have a nonlinear system, they linearize it so that it's again LTI, and it's a time varying system, they assume the time variation is smooth. So again, it's an LTI. So it's just a classic thing. You don't know how to solve a problem, or reduce it to the one you already know how to solve. Even though that reduction is a big jump or a big approximation. Anyway, we're not going to be that different from control people. We're going to assume the degradation effort has two parts to it. It has a degradation function and LTI or LSI degradation function H, impulse response H of N1 and N2, and then followed by some noise. That's how we get our GLX, comma Y. Why do I assume that? Again, it's mathematical tractability. And it approximates a lot of systems and a lot of situations. And so one of the things that you want to do if you have this restoration problem at hand, one approach is to try to estimate this function here, this LSI function. So estimating the degradation function. And there's really three ways of doing that. One way is just observe. So you look at G and let's say you have an image that has activity here, but these parts, you want to try to estimate either the noise or the LSI function or whatever. What are the parts of G where it hasn't been corrupted by noise or it hasn't been too much affected by noise. And then by looking at the parts of G where the signal is very strong, where F is dominantly in action, try to estimate this guy H. So technique number one, let me move this look at it, is observation based. And what I mean is go to parts of G that you have a priori knowledge. For example, if you're looking at astronomical signals from Hubble telescope, well, you know, there's star parts and then there's parts that are kind of uniform backgrounds. So maybe you can go to the uniform background and try to estimate the characteristics of noise from there. And then if you have some operator knowledge, oh, yeah, that's that store is, I don't know, I don't know, I know of its son, but let's say that store is XYZ in the background. And we already know that the diameter of XYZ is this much. And given this imaging system, it should only be so many pixels, but it's not. So it's a little bit more pixels. From that, you can then estimate the blur function. You can say something about H. In other words, use domain specific knowledge about your signal and the system we went through to make some intelligent guesses as to what H is and what the noise is. So go to parts of G that you have a prior knowledge and see how it should have looked and see how it does look. And from that, the use H and N, see how it looks and then compare to what it should have looked like. And then make some intelligent guesses. About H and the noise, H meaning the LTI system that corrupted. Hey Amazon Prime members, why pay more for groceries when you can save big on thousands of items at Amazon Fresh? Shop Prime exclusive deals and save up to 50% on weekly grocery favorites. Plus save 10% on Amazon brands, like our new brand Amazon Saver, 365 by Whole Foods Market, a plenty and more. Come back for new deals rotating every week. Don't miss out on savings. Shop Prime exclusive deals at Amazon Fresh. Select varieties. We wear our work day by day, stitch by stitch. At Dickies, we believe work is what we're made of. So whether you're gearing up for a new project or looking to add some tried and true work wear to your collection, remember that Dickies has been standing the test of time for a reason. Their work wear isn't just about looking good. It's about performing under pressure and lasting through the toughest jobs. Head over to Dickies.com and use the promo code Workware20 at checkout to save 20% on your purchase. It's the perfect time to experience the quality and reliability that has made Dickies a trusted name for over a century. What's another way of trying to figure out what the degradation functions are? Well, another way is by experimentation. Give it a known signal and look at the output. So, and that might not be possible in many experiments in many situations. Why? Well, I mean, can you imagine like we take a Hubble telescope and we look at the stars, we look at some other signal that we designed so that we can see what the output is. It's just not practical. It can't happen. So, but nevertheless, in some situations, it does happen. It's called calibration, right? Like, for example, in IC manufacturing, and Cindy and Alan can both talk about this, you could put a test pattern in front of your optical photography system and see what pattern you did on your wafer. So, because you knew the characteristic of that mask that you put in before your projection, suppose you took lots of SCM pictures of the mask, so you say this kind of mask produces this kind of output on the wafer. So, use that to characterize what your system is doing. Give it some test signals that you know very well and look at the output and then that tells you something about the system, okay? So, in other words, put a known signal that something is signaled and you know everything about into your system to calibrate it. And where else do we do we do we do that? Besides, I see the photography, where else people do this kind of stuff. In for example, computer vision, when you want to calibrate your cameras, you want trying to determine the internal and the external variables of your lens, right? You put a test pattern and what's the test pattern of people using computer vision all the time? Anybody? It's a checkered black and white pattern and you use that ahead of time in order to compute the intrinsic parameters of your camera and then from then on you send that camera in to the real world and it can you know you now have calibrated it, right? There's one thing that doesn't work in that situation and what's that? The focal length, right? It's one of the parameters. If your camera has autofocus, even if you calibrated it, if it keeps changing it, that internal parameter you can feed it during calibration and it changes all the time. So, that becomes useless. But generally speaking, that's a technique that's used all the time. And the third technique is is by modeling. Again, and I'll talk about this a little bit more next time, you're modeling the physics of the situation that you're confronted with. For example, when you look at earth images, there's a thing called atmospheric turbulence, movement of air and the high temperature of air and that result isn't blaring. And people sit down and model that. For example, Stanley and half-megle came up with this model for atmospheric turbulence, atmospheric turbulence. And it is h of omega 1 and omega 2 in the frequency domain is e to the minus k omega 1 squared plus omega 2 squared to the power of 5/6. And how do you think they came up with this 5/6 power? Lots of the same way as when you were taking freshman physics in high school or in college to compute f equals m a. What did your physics teacher have you do? You had a bunch of m's, you had a bunch of f's, you had a bunch of f's and you plotted it and said, "Oh, it's almost a straight line. Therefore, f equals m a, the same thing here." Why are you laughing? You didn't do that? Actually, the reason I said that my son is doing that now in his classes. So where does this 5/6 come around? You get a bunch of data or you try to fit your model into a data and say, "Okay." So when k is larger, you get more turbulence and you get more blaring and if k is smaller, you get less. Or you can model, for example, motion blur. You've got an image, it was obtained where camera was in motion and you can model the motion and then based on that model of the motion, try to undo it. And I'll talk about this a lot more. But for now, if you can just switch to the computer and we lost our operator, no, we got it. So if you switch to the computer for just a second, so that's the turbulence model. So this is an area image of a region without negligible turbulence. This is when k is 0.0025, so it's a lot more blurred and this is mild turbulence, 0.001 and this is very low turbulence, 0.0025. And again, you're analyzing the physics of the situation in order to come up with models. I want to stop now, so I'll see you all on Friday. And for those of you who are meeting me right after class, why don't you just come here and I would walk to Corey Hall and... Hey Amazon Prime members, why pay more for groceries when you can save big on thousands of items at Amazon Fresh? Shop Prime exclusive deals and save up to 50% on weekly grocery favorites. Plus save 10% on Amazon Brands, like our new brand Amazon Saver, 365 by Whole Foods Market, a plenty and more. Come back for new deals rotating every week. Don't miss out on savings. Shop Prime exclusive deals at Amazon Fresh. Select varieties. We wear our work, day by day, stitch by stitch. At Dickies, we believe work is what we're made of. So, whether you're gearing up for a new project, or looking to add some tried and true work wear to your collection, remember that Dickies has been standing the test of time for a reason. The work wear isn't just about looking good, it's about performing under pressure and lasting through the toughest jobs. Head over to Dickies.com and use the promo code Workwear20 at checkout to save 20% on your purchase. It's the perfect time to experience the quality and reliability that has made Dickey's a trusted name for over a century.