For built-in numeric types, an implicit conversion can be made when the value to be stored can fit into the variable without being truncated or rounded off. For example, a variable of type long (8 byte integer) can store any value that an int (4 bytes on a 32-bit computer) can store.
Refer Implicit Conversion section in this https://msdn.microsoft.com/en-us/library/ms173105.aspx
Now coming to your example obviously byte + byte need not necessarily be a byte. So byte+byte may be int. In that case "Implicit Conversion" will not fit because Upward casting is possible not vice versa, that is int can be converted to long, byte can be converted to int.
So in your case you need explicit conversion. Compiler needs you to perform this.
However, if a conversion cannot be made without a risk of losing information, the compiler requires that you perform an explicit conversion, which is called a cast. A cast is a way of explicitly informing the compiler that you intend to make the conversion and that you are aware that data loss might occur.
Refer explicit conversion in the same page.
so for your example
rgb.Red = (byte)(Convert.ToByte(Math.Round((h - 4) * delta)) + rgb.Green);
This will convert int to byte explicitly.