Place ham bone, onion, water, celery, and pepper in a large pot, cover, and bring to a boil. Reduce heat to low and simmer for 30 minutes.
Remove ham bone from pot and skim off any visible fat from broth.
Add potatoes and ¼ cup bell pepper to the pot and simmer for about 15 minutes, or until potatoes are tender.
Meanwhile, melt butter in a small saucepan over low heat. Whisk in flour, stirring constantly, until incorporated. Continue whisking for 1-2 more minutes. Increase heat to medium. While whisking, gradually stir in milk and half-and-half. Continue stirring while mixture becomes bubbly and thickens (about 3-5 minutes). Once thick enough to coat the spoon, remove from heat.
Once potatoes are tender, add milk mixture to soup pot and stir to combine. Simmer, uncovered, for an additional 5 minutes, or until soup reaches desired consistency. Add 1 cup of corn and cook for 1-2 more minutes. Using a stick blender (or a regular blender), puree soup to desired consistency. Stir in remaining 1 cup of corn, ham, and remaining ¼ cup of bell pepper and heat through. Add salt and pepper, to taste.